IE11 Cookie身份验证问题 - 多个站点,同一个域

时间:2017-12-18 15:50:04

标签: c# .net authentication cookies cookie-authentication

设置场景
我正在经历一个非常独特的场景,在代理下,我的ASPNet.SharedCookie似乎在IE11中消失或改变。我将设置场景:

我们有两个托管在不同服务器上的网站,我们可以打电话给他们:

  1. https://login.mydomain.com
  2. https://product.mydomain.com
  3. 第一个网站处理身份验证,它会检查凭据并为域.mydomain.com设置Cookie。这对99%的场景都很有效(我们拥有庞大的用户群)。

    问题
    我们有1个用户使用Citrix,因此他们通过代理访问产品,他们无法控制浏览器版本。他们必须使用IE11。

    因此,他们访问login.mydomain.com,输入他们的凭据并对cookie进行身份验证和设置,然后将其重定向到product.mydomain.com。但是,当他们访问这个网站时,cookie似乎没有或者似乎已被更改(我无法找到确切因为他们无法在他们的计算机上看到cookie),从我们知道的日志中我知道我们得到以下内容:

    Authorization failed for user: null.
    
    Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
    

    以前有没有人经历过这个?就像我说它适用于群众一样,但对于这种独特的情况,我们遇到了困难。

    细节
    登录站点的启动:

    // Was previously services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) but the issue still occurred
    services.AddAuthentication(options => 
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;                    
    })
    .AddCookie(options => {
        var protectionProvider = DataProtectionProvider.Create(new DirectoryInfo(Config.KeyLocation));
        var dataProtector = protectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Cookie", "v2");
        var ticketFormat = new TicketDataFormat(dataProtector);
    
        options.ClaimsIssuer = MyIdentity.AuthType;
        options.TicketDataFormat = ticketFormat;
        options.Cookie.Name = Config.CookieName;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.Domain = Config.Domain;
        options.Cookie.Expiration = TimeSpan.FromMinutes(Config.Expiration);
        options.Cookie.SameSite = SameSiteMode.None;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(Config.ExpireTimeMins);
        options.SlidingExpiration = true;
        options.Events = new CookieAuthenticationEvents()
        {
            OnRedirectToLogin = ctx =>
            {
                ctx.Response.Redirect(Config.Login);
                return Task.FromResult<object>(null);
            }
        };
    });
    

    我也在呼叫service.AddDataProtection.PersistKeysToFileSystem

    如果我应该为产品添加启动代码,请告诉我,不确定它是否有任何区别,因为我认为重定向会发生cookie的问题。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我在您的代码段中看到SameSite配置被设置为None。

此后,根据以下链接添加了对IE11下SameSite Cookies的支持:

一种解决方法是将您的数据存储在localStorage中,这应由较旧的IE11版本支持。