我尝试设置FormsAuthentication
登录并使用角色注销。为什么@User.Identity.Name
返回Windows域用户名并设置了这些配置?
<authentication mode="Forms">
<forms name="Login" loginUrl="~/User/Login" defaultUrl="~/Home/Index" protection="All" timeout="90" slidingExpiration="true"/>
</authentication>
在VS2015项目属性中 - &gt;开发服务器,Windows身份验证设置为已禁用。
结果,我有时会使用@User.Identity.Name
显示表单用户名,但大部分时间我登录或注销时,都会获得Windows域名。我应该在user.UserName
中获得@User.Identity.Name
(如果我理解它正确显示的内容)。
在UserController中,我使用FormsAuthenticationTicket
设置了HttpCookie
。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now, DateTime.Now.AddMinutes(90), user.RememberMe, user.Roles, FormsAuthentication.FormsCookiePath);
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
if (ticket.IsPersistent)
{
cookie.Expires = ticket.Expiration;
}
Response.Cookies.Add(cookie);
FormsAuthentication.RedirectFromLoginPage(user.UserName, user.RememberMe);
在注销期间,我将相同的Cookie设置为空,并Session.Abandon()
。
FormsAuthentication.SignOut();
Session.Abandon();
HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);
// clear authentication cookie
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie);
return RedirectToAction("Login", "User");
这是我显示用户名的方式:
@if (User != null)
{
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown">
Logged in as @User.Identity.Name
<span class="caret"></span>
</a>
我尝试了各种各样的事情,但是我把头发拉到这里,无法理解我哪里出错了。
答案 0 :(得分:1)
您做错了,当然,您要创建两个身份验证Cookie。
第一个来自
Response.Cookies.Add(cookie);
另一个来自
FormsAuthentication.RedirectFromLoginPage(user.UserName, user.RememberMe);
退出时,您有类似的重复。这一行
FormsAuthentication.SignOut();
将过期的表单Cookie附加到响应中,但是再次执行
Response.Cookies.Add(cookie);
最后但并非最不重要的是,如果您显示用户名,请确保该用户是高等教育的
@if (User != null && User.Identity != null && User.Identity.IsAuthenticated)
否则您将冒险显示未经身份验证的请求的用户名。
你应该做什么:
确保您要正确处理身份验证的所有控制器/操作都使用Authorize
使用Http调试器(Fiddler,Charles,Burp)确保从服务器向客户端发送单个身份验证cookie,并返回连续请求。
如有必要,在浏览器中清除所有重复的待处理Cookie - 您之前的失败尝试之一可能已创建了一个包含Windows用户名且浏览器发送的长期持久性Cookie每个请求都有这个待处理的cookie。