Windows身份验证问题

时间:2017-08-22 09:25:41

标签: c# session authentication forms-authentication

我尝试设置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>

我尝试了各种各样的事情,但是我把头发拉到这里,无法理解我哪里出错了。

1 个答案:

答案 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)

否则您将冒险显示未经身份验证的请求的用户名。

你应该做什么:

  1. 确保您要正确处理身份验证的所有控制器/操作都使用Authorize

  2. 进行修饰
  3. 使用Http调试器(Fiddler,Charles,Burp)确保从服务器向客户端发送单个身份验证cookie,并返回连续请求。

  4. 如有必要,在浏览器中清除所有重复的待处理Cookie - 您之前的失败尝试之一可能已创建了一个包含Windows用户名且浏览器发送的长期持久性Cookie每个请求都有这个待处理的cookie。