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

我缺少的东西吗?

有帮助吗?

解决方案

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

你的问题是在这一点上,你只设置身份验证Cookie,即获取Forms身份验证模块内创建将不会发生,直到有一个新的请求的IPrincipal - 所以在这一点上HttpContext.User中是一个奇怪的状态。一旦发生重定向的话,因为它是从浏览器一个新的请求到达您的网页前,cookie将获得阅读和创建正确的用户对象。

缓存的请求完成后,仅在浏览器上设置。

顺便RedirectFromLoginPage创建一个形式AUTH饼干反正则不需要做手工

其他提示

请尝试System.Web.HttpContext.Current.Request.LogonUserIdentity.Name代替User.Identity.Name。它为我工作。

HttpContext.Current.User.Identity.Name的值由呼叫RedirectFromLoginPage设置。您可以从HttpContext.Current.User.Identity.Name获取当前用户ID,一旦你被重定向到一个新的页面。我不知道你为什么会需要通过用户属性在这种情况下访问用户名,不能你只需要使用包含在tbUsername.Text价值?

在VS 2015年社区版本,如果你创建一个Web窗体应用程序,它会自动在web.config中节点添加代码删除FormsAuthentication,试着删除下面部分

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

如已经建议FormsAuthentication.RedirectFromLoginPage()方法,自动设置认证cookie。

但是在我的情况,我已经嵌套在那里我有儿童应用在<httpModules>文件清除web.config标签(所以它不会从其父应用继承的HttpModules)的Web应用程序。删除了一切不必要的父母的HttpModules重新工作。

其更好复杂的东西之前检查此标记:)

如果你正在寻找从成员提供的用户名,尝试这样的事情......

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

如果您正在使用URL重写或者改变您的网址,也可能是原因空车返回空value.You应该试着从html的为.aspx或无extendtion你的URL的变化路径。这是问题我case.You try.I希望这个有用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top