HttpContext.Current.User.Identity.Name 总是空字符串。

27

你好,我使用自定义的MembershipProvider。

在应用程序场景中,我想知道当前的用户名,但是当我尝试访问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);
}

我有什么遗漏吗?


那段代码看起来很简单。你确定用户已经通过身份验证了吗?有没有什么动态更改提供者或类似的有趣操作? - Matt Sherman
用户已通过身份验证 - Shimmy Weitzhandler
你是否使用FormsAuthentication.SetAuthCookie在身份验证cookie中设置了用户名? - Joe Chung
你是如何分发你的cookie的?你是用什么方法调用上面的代码的? - Phaedrus
1
我已经编辑了我的回答,请现在查看。 - Muhammad Akhtar
7个回答

36
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""
你的问题在于你目前只设置了身份验证的cookie,而在forms身份验证模块内创建的IPrincipal状态不会发生变化,直到有一个新请求——因此,在那个时候HttpContext.User处于一种奇怪的状态。一旦重定向发生,因为它是来自浏览器的新请求,所以在到达页面之前,cookie将被读取并创建正确的用户对象。
仅在请求完成后才在浏览器上设置Cookie。
顺便说一句,RedirectFromLoginPage会自动创建Forms认证Cookie,所以你不需要手动创建。

这是一个很好的观点。您是否在设置cookie/进行登录的同一页上测试用户名?如果是这样,在后续页面上检查HttpContext.Current.User.Identity。 - Matt Sherman
非常好的答案。但是这对我的问题没有太大帮助。我想能够根据用户的角色将用户重定向到特定页面。管理员直接进入管理员面板,普通用户进入欢迎页面,高级用户进入其他特定页面...我希望使用User.IsInRole()来确定LogOn操作方法的ActionResult...但正如你所说的那样,它处于“奇怪的状态” :-) - Peter Perháč

24
请尝试使用System.Web.HttpContext.Current.Request.LogonUserIdentity.Name代替User.Identity.Name。我尝试后生效了。

2
这是不同的。当我在我的网站上读取此值时,我会得到我的Windows帐户(AD)... - Jowen
1
如果User.Identity.Name为空,而您希望它不是空的,但LogonUserIdentity.Name不是空的,则可能存在应用程序主机配置问题,如果您正在使用Visual Studio进行调试,请参阅我的SO问题以获取更多信息。https://dev59.com/9njZa4cB1Zd3GeqPfpJD#19689343 - Jagd
是的,我同意Jowen的观点。那不是被要求的同一身份识别...但我想它很酷并且可访问。 - Piotr Kula

9

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


2
在VS Community 2015版本中,如果您创建了一个Web Forms应用程序,它会自动添加代码到web.config节点中以删除FormsAuthentication。请尝试删除下面的这个部分。
<modules>
  <remove name="FormsAuthentication"/>
</modules>

1
正如已经建议的那样,FormsAuthentication.RedirectFromLoginPage() 方法会自动设置身份验证 Cookie。
然而在我的情况下,我有嵌套的 Web 应用程序,在子应用程序中清除了 <httpModules> 标记(以便它不会从其父应用程序继承 httpModules)在 web.config 文件中。删除不需要的父级 httpModules 后,一切都能正常工作。
在复杂化事情之前最好检查此标记 :)

0
如果您正在寻找成员提供程序中用户的名称,请尝试类似以下的代码...
var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );

2
如果我需要用户而不是用户名,那么我可以简单地使用Membership.GetUser(); - Shimmy Weitzhandler

0
如果您正在使用URL重写或更改您的URL,可能会导致返回空值或null值。您应该尝试将URL路径从.html更改为.aspx或不带扩展名。这在我的情况下就是个问题。你可以尝试一下。我希望这对您有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接