Asp.net HttpContext.Current.User.Identity.Name始终为string.Empty

Asp.net HttpContext.Current.User.Identity.Name始终为string.Empty,asp.net,httpcontext,custom-membershipprovider,iidentity,Asp.net,Httpcontext,Custom Membershipprovider,Iidentity,您好,我使用自定义会员资格提供商 我想在应用程序场景中知道当前用户名,但当我尝试访问HttpContext.current.User.Identity.Name时,它总是返回string.Empty if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text)) { FormsAuthentication.SetAuthCookie(tbUsername.Text, true); bool x = User.Ident

您好,我使用自定义会员资格提供商

我想在应用程序场景中知道当前用户名,但当我尝试访问HttpContext.current.User.Identity.Name时,它总是返回string.Empty

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text))
{
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
    bool x = User.Identity.IsAuthenticated; //true
    string y = User.Identity.Name; //""
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked);
}

我遗漏了什么吗?

如果您正在从会员资格提供商处查找用户名,请尝试以下操作

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );

HttpContext.Current.User.Identity.Name的值是通过调用
RedirectFromLoginPage
设置的。重定向到新页面后,您可以从
HttpContext.current.user.Identity.Name
获取当前用户id。我不知道为什么您需要在这个上下文中通过user属性访问用户名,您不能只使用tbUsername.Text中包含的值吗

FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""
现在的问题是,您只是在设置身份验证cookie,在表单身份验证模块中创建的IPrincipal在出现新请求之前不会发生,因此此时HttpContext.User处于一种奇怪的状态。一旦重定向发生,因为这是来自浏览器的新请求,cookie将在到达页面和创建正确的用户对象之前被读取

Cookie仅在请求完成后才在浏览器上设置


作为LoginPage创建表单身份验证cookie的一种方法,您无需手动执行此操作

请尝试
System.Web.HttpContext.Current.Request.LogonUserIdentity.Name
而不是
User.Identity.Name
。它对我很有效。

正如前面建议的
FormsAuthentication.RedirectFromLoginPage()
方法,自动设置身份验证Cookie

然而,在我的例子中,我在
web.config
文件中有嵌套的web应用程序,其中我清除了子应用程序中的
标记(这样它就不会从其父应用程序继承httpModules)。删除不需要的父httpModules使一切都恢复正常


最好在使事情复杂化之前检查此标记:)

如果您正在使用URL重写或更改URL,可能会导致返回空null值。您应该尝试将URL的路径从.html更改为.aspx或无扩展名。这是我的问题。请尝试。我希望这在VS Community 2015版本中有用,如果您创建web表单应用程序,它会自动在web.config节点中添加代码以删除表单身份验证,请尝试下面的删除部分

<modules>
  <remove name="FormsAuthentication"/>
</modules>


这段代码似乎很简单。您确定用户已通过身份验证?动态更改提供程序或类似的更改有什么有趣的事情吗?没有有趣的事情,、用户经过身份验证您是否使用FormsAuthentication.SetAuthCookie在身份验证cookie中设置了用户名?您如何发送cookie?你用什么方法调用上面的代码?我已经编辑了我的答案,现在检查…这是一个很好的观点。您是否在设置cookie/登录的同一页面上测试用户名?如果是这样,请在后续页面上检查HttpContext.Current.User.Identity。回答得很好。但这对我的问题没有多大帮助。我希望能够根据用户的角色将用户重定向到特定页面。管理员直接进入管理面板,普通用户进入欢迎页面,高级用户进入特定的其他页面。。。我希望使用User.IsInRole()来确定登录操作方法的ActionResult。。。但正如您所说,它“处于一种奇怪的状态:-)如果我需要用户而不是用户名,那么我可以简单地使用Membership.GetUser();:这是不一样的。当我在我的网站上读取此值时,我会获得我的Windows帐户(AD)…如果User.Identity.Name为空,而您希望它为空,但LogonUserIdentity.Name为空,则如果您正在Visual Studio外调试,则您的applicationhost.config可能有问题。有关更多信息,请参阅我的SO问题。是的,我同意乔文的看法。。这与要求的身份不同。。。但我想这是很酷的。