跨.net和Core上的子域的ASP.NET Identity Cookie

时间:2018-03-03 11:47:02

标签: cookies asp.net-core webforms asp.net-identity data-protection

我有很多应用程序托管在主域和子域上:

www.example.com上的网站A,ASP.NET(.Net Core 2.0)

网站B,site.example.com上的ASP.NET Webform(4.7 .net Framework)

  

account.example.com上的网站C,ASP.NET 身份(。Net Core 2.0)

网站D,file.example.com上的ASP.NET Webform(4.7 .net Framework)

我想在 account.example.com 上登录使用,经过身份验证的用户将重定向到其他网站。他们将通过其他网站上的角色进行授权。

我正在尝试在这些网站之间共享Cookie,并且所有网站都托管在 Azure Web App 上。

我正在使用 ASP.NET身份(.Net Core 2.0)。我正在使用内置的cookie身份验证。

如何在所有应用程序中使用Data Protection并在其中共享cookie。

对于数据保护,我的代码是:

 services.AddDataProtection()
            .SetApplicationName("example")
            .PersistKeysToFileSystem(new DirectoryInfo(@"%HOME%\ASP.NET\DataProtection-Keys"))
            .SetDefaultKeyLifetime(TimeSpan.FromDays(14));

对于Cookie身份验证,我的代码是:

 app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            CookieDomain = ".example.com"
        });

2 个答案:

答案 0 :(得分:0)

关于.Net Core,如果你想在几个站点之间共享你的cookie,你可以尝试以下来初始化它而不是UseCookieAuthentication:

Age Income
39   <=50K
50   <=50K
38   <=50K
53   <=50K
28   <=50K
37   <=50K
49   <=50K
52   >50K
31   >50K
42   >50K
37   >50K
30   >50K
23   <=50K
32   <=50K
40   >50K
34   <=50K
25   <=50K
32   <=50K

当然,您需要为所有站点提供相同的ProtectionProvider路径。

答案 1 :(得分:0)

我从此Microsoft文档中获得了解决方案

Share cookies among apps with ASP.NET and ASP.NET Core

此子域身份验证系统的示例代码

Cookie Sharing Sample App - GitHub

  

该示例说明了使用Cookie身份验证的三个应用之间的Cookie共享:

  • 不使用ASP.NET Core身份的ASP.NET Core 2.0 Razor Pages应用
  • 具有ASP.NET Core身份的ASP.NET Core 2.0 MVC应用
  • 具有ASP.NET身份的ASP.NET Framework 4.6.1 MVC应用
  

将此代码放在Startup.cs的ConfigureServices方法中

services.AddDataProtection()
.PersistKeysToFileSystem(GetKeyRingDirInfo())
.SetApplicationName("example");

services.ConfigureApplicationCookie(options => 
{   
options.Cookie.Name = "example";
options.Cookie.Domain = ".example.com";
});
  

对于KeyRing方法

private DirectoryInfo GetKeyRingDirInfo()
    {
        var startupAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        var applicationBasePath = System.AppContext.BaseDirectory;
        var directoryInfo = new DirectoryInfo(applicationBasePath);
        do
        {
            directoryInfo = directoryInfo.Parent;

            var keyRingDirectoryInfo = new DirectoryInfo(Path.Combine(directoryInfo.FullName, "KeyRing"));
            if (keyRingDirectoryInfo.Exists)
            {
                return keyRingDirectoryInfo;
            }
        }
        while (directoryInfo.Parent != null);

        throw new Exception($"KeyRing folder could not be located using the application root {applicationBasePath}.");
    }
  

注意:您必须复制在Identity应用程序托管服务器上自动生成的KeyRing文件,然后手动粘贴到其他网站的其他子域和主域托管服务器上,以共享Cookie进行身份验证。 < / p>