首页 > 解决方案 > 身份验证处理后 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 修复的要点是……

  1. 更新您的 Owin 软件包以确保您使用的是 4.1 版
  2. 将 Startup.cs 中的 CookieAuthenticationOptions 调整为我在上面添加的项目,以使 Owin cookie 兼容。
  3. 更新您的 Web.config 中的以下内容以使您的 Asp.net cookie 兼容

    <system.web>
       <sessionState cookieSameSite="Strict" />
       <httpCookies requireSSL="true" />
    </system.web>
    

做这三件事(以及在 SSL 下运行您的项目)将导致 Chrome 将 cookie 报告为安全和严格。

标签: asp.net-mvcgoogle-chromeowin

解决方案


Google 对Chrome 处理不带该属性的cookie的方式进行了更改。SameSite以前,Chrome 将未SameSite在 cookie 上设置属性视为与具有相同SameSite=None,这意味着浏览器将接受所有 cookie。现在,他们将其视为 have SameSite=Lax,它只接受来自同一域的 cookie。要获得与旧方法相同的效果,必须将属性设置为SameSite=None; Secure.

我不知道这是否会影响您,但如果是这种情况,您会在 Chrome 控制台中看到错误。

Chrome <code>SameSite</code> 控制台警告。

正式发布是 2 月 4 日 IIRC,但他们正在分阶段推出来判断正在引起的问题。

一些资源:
Microsoft ASP.NET 博客关于即将发生的变化/存档副本
Chromium 博客/存档副本


推荐阅读