您好我使用自定义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);
}
我错过了什么吗?
答案 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或无延伸。这是我的问题。你试试。我希望这个有用