如何在所有子域中保留身份验证Cookie?

时间:2017-09-12 19:48:49

标签: c# cookies asp.net-core asp.net-core-2.0

所以我完成了从aspnetcore1.1到aspnetcore2.0的迁移,并正在与Startup.cs中的新身份验证设置进行斗争。

我的所有网站都共享同​​一个域名'.example.com'。用户使用他们的Google帐户登录,然后发出一个应用程序cookie,我想在'.example.com'的所有子域中保留这些cookie。

但是,现在,当用户登录时,cookie已成功创建,但是会从域中的每个其他站点注销。有人可以捅这个吗?

public void ConfigureServices (IServiceCollection services)
{
    // ...-snip-...

    services.ConfigureApplicationCookie(options =>
    {
        options.Cookie.Name = ".AuthCookie";
        options.Cookie.Expiration = TimeSpan.FromDays(7);
        options.LoginPath = "/Account/Login";
        options.Cookie.Domain = ".example.com";
    });

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
       .AddGoogle(options => { /* ...-snip...- */ });

    // ...-snip-...
}

public void Configure (IApplicationBuilder app)
{
    // ...-snip-...

    app.UseAuthentication();

    // ...-snip-...
}

我的所有应用都在Startup.cs个文件中共享相同的代码。它与使用CookieAuthenticationDefaults有关吗?或者我错过了ConfigureApplicationCookie中的某些内容?

1 个答案:

答案 0 :(得分:3)

知道了!看起来我需要创建一个数据保护提供程序to share authentication cookies between applications。以下是工作代码更改:

services.ConfigureApplicationCookie(options =>
{
    var protectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\shared-auth-ticket-keys\"));

    options.Cookie.Name = ".AuthCookie";
    options.Cookie.Expiration = TimeSpan.FromDays(7);
    options.LoginPath = "/Account/Login";
    options.Cookie.Domain = ".example.com";
    options.DataProtectionProvider = protectionProvider;
    options.TicketDataFormat = new TicketDataFormat(protectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Cookies", "v2"));
});
相关问题