【问题标题】:HttpContext.Current.User.Identity.Name is always string.EmptyHttpContext.Current.User.Identity.Name 总是 string.Empty
【发布时间】:2010-11-06 14:08:12
【问题描述】:

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

我错过了什么吗?

【问题讨论】:

  • 该代码看起来很简单。您确定用户已通过身份验证?有什么有趣的事情可以动态更改提供者或类似的吗?
  • 没什么好笑的 bizniz,用户已通过身份验证
  • 您是否使用 FormsAuthentication.SetAuthCookie 在身份验证 cookie 中设置了用户名?
  • 你是如何发送你的cookie的?你用什么方法调用上面的代码?
  • 我已经编辑了我的答案,现在检查....

标签: asp.net httpcontext custom-membershipprovider iidentity


【解决方案1】:
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

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

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

顺便说一句,RedirectFromLoginPage 无论如何都会创建一个表单身份验证 cookie,您不需要手动执行此操作

【讨论】:

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

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

【讨论】:

  • 这是不同的。当我在我的网站上阅读此值时,我得到了我的 Windows 帐户 (AD) ...
  • 如果 User.Identity.Name 为空并且您希望它不是,但 LogonUserIdentity.Name 不是,那么如果您在 Visual Studio 之外进行调试,则您的 applicationhost.config 可能有问题.有关更多信息,请参阅我的 SO 问题。 stackoverflow.com/questions/19686933/…
  • 是的,我同意 Jowen 的观点。这与所要求的身份不同......但我想它很酷,可以访问。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      但是,在我的情况下,我有嵌套的 Web 应用程序,我在 web.config 文件中清除了子应用程序中的 &lt;httpModules&gt; 标记(这样它就不会从其父应用程序继承 httpModules)。删除不需要的父 httpModules 使一切恢复正常。

      在复杂化之前最好检查一下这个标签:)

      【讨论】:

        【解决方案6】:

        如果您要从会员提供者那里寻找用户的姓名,请尝试这样的操作...

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

        【讨论】:

        • 如果我需要用户而不是用户名,那么我可以简单地使用 Membership.GetUser(); :
        【解决方案7】:

        如果您使用 URL 重写或更改 URL,可能会导致返回 Empty null 值。您应该尝试将 URL 的路径从 .html 更改为 .aspx 或无扩展。这是我的问题。你试试。我希望这有用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多