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);
}

我错过了什么吗?

4

7 回答 7

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

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

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

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

于 2009-06-29T06:00:18.287 回答
24

请尝试 System.Web.HttpContext.Current.Request.LogonUserIdentity.Name代替User.Identity.Name. 它对我有用。

于 2012-09-24T13:44:28.507 回答
9

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

于 2009-06-29T05:41:06.240 回答
2

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

<modules>
  <remove name="FormsAuthentication"/>
</modules>
于 2016-03-31T00:02:01.520 回答
1

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

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

在使事情复杂化之前最好检查这个标签:)

于 2014-02-17T09:52:34.523 回答
0

如果您正在从会员提供者那里寻找用户的名字,请尝试这样的事情......

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );
于 2009-06-29T03:57:30.253 回答
0

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

于 2014-04-09T16:55:18.593 回答