ASP.NET Core RC2 和 .NET 4.5.1 应用程序之间的共享 cookie 身份验证

Shared cookie authentication between ASP.NET Core RC2 and .NET 4.5.1 apps

我们有两个 .NET 应用程序 运行 共享 cookie 身份验证。一个是 ASP.NET Core RC1 应用,另一个是经典的 .NET 4.5.1 应用。

目前使用 Startup.csConfiguration 方法中过时的 Microsoft.Owin.Security.Cookies.Interop 进行设置:

这工作正常,但 RC2 不支持该方法。

我们如何开始使用 RC2 的共享 cookie 身份验证?

结合 https://github.com/GrabYourPitchforks/aspnet5-samples/tree/dev/CookieSharing and Sharing authentication cookie among Asp.Net Core 1 (MVC6) and MVC 5 applications 我想出了一个可行的解决方案。我不知道这是否是 "correct" 的方法,但它有效,所以这里是:

  1. 在两个应用程序中使用 nuget-package Microsoft.Owin.Security.Interop 1.0.0-rc2-final

  2. 创建一个 TicketDataFormat 使用 DataProtectionProvider 为加密密钥指定磁盘上的相同位置,以及相同的目的。

  3. 在两个应用程序中以 owin 方式配置 cookie 身份验证。指定相同的 CookieNameTicketDataFormat:

.NET 4.5.1,在Startup.cs的Configure方法中:

var authenticationType = "Cookies";
var cookieName = "myCookieName";
var cookieEncryptionKeyPath= "C:/mypath";

var dataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(cookieEncryptionKeyPath));
var dataProtector = dataProtectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", authenticationType, "v2");
var ticketDataFormat = new AspNetTicketDataFormat(new DataProtectorShim(dataProtector));

app.SetDefaultSignInAsAuthenticationType(authenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = authenticationType,
            CookieName = cookieName,
            TicketDataFormat = ticketDataFormat
        });

.NET CORE RC2中Startup.cs的Configure方法:

var authenticationType = "Cookies";
var cookieName = "myCookieName";
var cookieEncryptionKeyPath= "C:/mypath";

var protectionProvider = DataProtectionProvider.Create(new DirectoryInfo(cookieEncryptionKeyPath));
var dataProtector = protectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", authenticationType, "v2");
var ticketFormat = new TicketDataFormat(dataProtector);


app.UseCookieAuthentication(
                new CookieAuthenticationOptions
                {
                    CookieName = options.CookieName,
                    CookieDomain = options.CookieDomain,
                    TicketDataFormat = ticketFormat
                });