asp.net-mvc - 身份验证处理后 Chrome 不会重定向回 URL
问题描述
至少几年来,我一直在我的 MVC 解决方案中使用与此类似的代码......
[Authorize]
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
..........
然后在我的身份验证代码中
myAuthenticationProperties = new Microsoft.Owin.Security.AuthenticationProperties();
myAuthenticationProperties.AllowRefresh = true;
myAuthenticationProperties.ExpiresUtc = DateTime.UtcNow.AddMinutes(60);
myAuthenticationManager.SignIn(myAuthenticationProperties, myClaimsIdentity);
return RedirectToAction("Index", "Home");
在我的启动中..
public void Configuration(IAppBuilder app)
{
CookieAuthenticationOptions myAuthOptions = new CookieAuthenticationOptions();
myAuthOptions.AuthenticationType = "ApplicationCookie";
myAuthOptions.CookieHttpOnly = true;
myAuthOptions.SlidingExpiration = true;
myAuthOptions.LoginPath = new PathString("/Authentication/LogIn");
//This is what was added for the Owin cookie "fix"
myAuthOptions.CookieSameSite = SameSiteMode.Strict;
myAuthOptions.CookieSecure = CookieSecureOption.Always;
app.UseCookieAuthentication(myAuthOptions);
}
生活一直很美好……直到现在。我一直在到处追赶我的尾巴,试图弄清楚为什么当我尝试登录时,有时它可以工作,而有时它只是挂起。使用一些调试消息,我发现我的身份验证过程完成,但是当 RedirectToAction 发生时,什么都没有发生......只是挂起。
然后我有一个突破,我尝试使用 IE 和 Edge,它似乎每次都有效。只有 Chrome 挂起,它至少有 75% 的时间会挂起,如果不是更多的话。
** 更新 **
我已经使用了 Fiddler 和 Chrome 的调试(控制台和网络选项卡),当 RedirectToAction 发生时,就网站而言,它已经完成。然而,没有什么,我的意思是什么,回到我的客户的网络上(根据 Fiddler 和 Chrome 的网络)。
然而,如果我手动更改 url 以返回主页,Chrome 很高兴,我现在已通过身份验证,我的 [Authorize] 现在允许加载控制器。
我已经研究了新的 Chrome cookie 的东西,虽然“修复”似乎像泥巴一样清晰,但我能够找到使用代码强制 SameSite cookie 报告 LAX 以外的其他内容的人。我实现了这一点,实际上将其设置为“严格”并且仍然...... Chrome 挂起。
**创可贴**
我不知道这会给我带来多少时间,但我通过使用 Javascript 计时器解决了这个问题,当用户单击提交按钮时,计时器启动,等待 6 秒,然后重定向回主页/指数。
如果问题不存在(IE、Edge),客户端会在计时器有机会占用之前自动重定向。如果他们正在使用 Chrome 并且它决定挂起,6 秒后它会表现得好像他们的浏览器很慢,也会把他们带到正确的地方。
** 固定(也许) **
因此,即使没有看到返回客户端的网络流量,我最终(除了上面的创可贴之外)实施了一些额外的更改,因此现在 Owin 和 Asp.net cookie 都报告 Secure 和 sameSite = Strict . 这似乎对我的问题产生了影响,并且在它仍然想挂起的情况下,我的定时重定向可以解决问题。
对于那些可能也遇到这种奇怪的人来说,Cookie 修复的要点是……
- 更新您的 Owin 软件包以确保您使用的是 4.1 版
- 将 Startup.cs 中的 CookieAuthenticationOptions 调整为我在上面添加的项目,以使 Owin cookie 兼容。
更新您的 Web.config 中的以下内容以使您的 Asp.net cookie 兼容
<system.web> <sessionState cookieSameSite="Strict" /> <httpCookies requireSSL="true" /> </system.web>
做这三件事(以及在 SSL 下运行您的项目)将导致 Chrome 将 cookie 报告为安全和严格。
解决方案
Google 对Chrome 处理不带该属性的cookie的方式进行了更改。SameSite
以前,Chrome 将未SameSite
在 cookie 上设置属性视为与具有相同SameSite=None
,这意味着浏览器将接受所有 cookie。现在,他们将其视为 have SameSite=Lax
,它只接受来自同一域的 cookie。要获得与旧方法相同的效果,必须将属性设置为SameSite=None; Secure
.
我不知道这是否会影响您,但如果是这种情况,您会在 Chrome 控制台中看到错误。
正式发布是 2 月 4 日 IIRC,但他们正在分阶段推出来判断正在引起的问题。
推荐阅读
- django - 有人可以解释何时/如何使用 Queryset 修改与 Django Rest Framework 的权限吗?
- java - JOptionPane.showOptionDialog 在 Mac 上太小
- python - 在 Linux 中以管理员权限运行 Jupyter Notebook
- node.js - 带有动态 URL 的 Webpack 开发服务器代理
- html - 两行文本的边框半径四舍五入
- vbscript - 如何使用 PowerDesigner VBScript 创建触发器并分配 TriggerTemplate?
- qt - 如何通过 id 使用 ffmpeg 记录窗口?
- swift - 如何将 xcassets 目录迁移到 Swift 包管理器?
- python - Python打包带demo
- javascript - 从参数字符串反应路由器中隐藏 URL id