HttpContext.Current.User.Identity.Name始终是string.Empty

时间:2009-06-29 03:46:28

标签: asp.net httpcontext custom-membershipprovider iidentity

您好我使用自定义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);
}

我错过了什么吗?

7 个答案:

答案 0 :(得分:34)

FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

您遇到的问题是此时您只设置了身份验证cookie,在表单身份验证模块中创建的IPrincipal将不会发生,直到有新请求 - 所以此时HttpContext.User就在一个奇怪的状态。一旦重定向发生,那么因为它是来自浏览器的新请求,所以在您的页面到达并创建了正确的用户对象之前,cookie将被读取。

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

另外,RedirectFromLoginPage创建了一个表单auth cookie,你不需要手动执行

答案 1 :(得分:22)

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

答案 2 :(得分:8)

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

答案 3 :(得分:2)

在VS Community 2015版中,如果您创建了一个Web表单应用程序,它会自动在web.config节点中添加代码以删除FormsAuthentication,请尝试删除以下部分

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

答案 4 :(得分:1)

如已建议的FormsAuthentication.RedirectFromLoginPage()方法,请自动设置身份验证Cookie。

但是在我的情况下,我有嵌套的web应用程序,我在子应用程序中清除了<httpModules>标记(以便它不会从其父应用程序继承httpModules)在web.config文件中。删除不需要的父httpModules使一切都恢复正常。

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

答案 5 :(得分:0)

如果您要从会员提供商处查找用户名,请尝试以下此类内容......

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

答案 6 :(得分:0)

如果您正在使用网址重写或更改网址,则可能会导致返回空的空值。您应该尝试将网址从.html更改为.aspx或无延伸。这是我的问题。你试试。我希望这个有用