gpt4 book ai didi

c# - Windows 身份验证问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:19 24 4
gpt4 key购买 nike

我正在尝试使用角色设置 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项目属性->开发服务器中,Windows Authentication设置为Disabled。

结果,我有时会使用 @User.Identity.Name 获取表单用户名显示,但大多数情况下,当我登录或注销时,我获取的是 Windows 域名。我应该在 @User.Identity.Name 中获取 user.UserName(如果我理解它正确显示的内容)。

在 UserController 中,我设置了一个带有 HttpCookieFormsAuthenticationTicket

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>

我已经尝试了各种各样的事情,但我在这里拉扯我的头发,无法理解我哪里出错了。

最佳答案

当然,您做错的是创建两个 身份验证 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. 确保您想要正确处理身份验证的所有 Controller /操作都装饰有 Authorize

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

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

关于c# - Windows 身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45813737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com