У меня есть два приложения: старое, написанное на ASP.NET MVC5, и новое, написанное на ASP.NET Core 2.2.Я хочу поделиться файлом cookie, созданным в приложении ASP.NET Core, с ASP.NET MVC5.Я попробовал то, что объясняется в этой статье https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-2.2, но кажется, что мой ASP.NET MVC5 не находит cookie.(Может быть, потому что я не использую Microsoft.Identity для пользователей?) Файл cookie создается в ASP.NET Core с этой конфигурацией (Startup.cs):
public void ConfigureServices(IServiceCollection services)
{
// Cookie
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\shared-auth-ticket-keys\"))
.SetApplicationName(CookieConst.SHARED_APP_NAME);
services
.AddAuthentication(CookieConst.AUTHENTICATION_TYPE)
.AddCookie(CookieConst.AUTHENTICATION_TYPE, options =>
{
options.Cookie.HttpOnly = false;
options.LoginPath = new PathString("/login");
options.LogoutPath = new PathString("/login");
options.AccessDeniedPath = new PathString("/login");
options.Cookie.HttpOnly = false;
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.Name = CookieConst.AUTHENTICATION_SCHEME;
options.Cookie.Path = "/";
options.Cookie.Domain = "localhost";
options.DataProtectionProvider = DataProtectionProvider.Create(
new DirectoryInfo(@"c:\temp\shared-auth-ticket-keys\"),
(builder) => { builder.SetApplicationName(CookieConst.SHARED_APP_NAME); }).CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
CookieConst.AUTHENTICATION_TYPE,
"v2");
});
…
}
Файл cookie создается с этим кодомвызывается с помощью логина:
public void Validate()
{
AuthenticationProperties authenticationProperties;
ClaimsPrincipal principal;
string cultureName;
var expireTime = DateTimeHelper.GetNowDate().AddMinutes(CookieConst.EXPIRE_TIME_IN_MINUTES);
authenticationProperties = new AuthenticationProperties()
{
AllowRefresh = true,
IsPersistent = true,
ExpiresUtc = expireTime
};
// Add Authentication Cookie
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "test"),
new Claim(BeanClaimTypes.User, "-1"),
new Claim(BeanClaimTypes.Company, "-1"),
new Claim(BeanClaimTypes.Roles, "testRole"),
new Claim(BeanClaimTypes.Permissions, "testPermission"),
new Claim(BeanClaimTypes.Culture, "en-US")
};
var identity = new ClaimsIdentity(claims, CookieConst.AUTHENTICATION_TYPE);
principal = new ClaimsPrincipal(identity);
HttpContext.SignInAsync(CookieConst.AUTHENTICATION_TYPE, principal, authenticationProperties);
}
В приложении ASP.NET MVC5 это конфигурация (Startup.Auth.cs):
public void ConfigureAuth(IAppBuilder app)
{
//// Configure the db context, user manager and signin manager to use a single instance per request
//app.CreatePerOwinContext(ApplicationDbContext.Create);
//app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
//app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = CookieConst.AUTHENTICATION_TYPE,
CookieName = CookieConst.AUTHENTICATION_SCHEME,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) =>
user.GenerateUserIdentityAsync(manager))
},
TicketDataFormat = new AspNetTicketDataFormat(
new DataProtectorShim(
DataProtectionProvider.Create(new DirectoryInfo(@"c:\temp\shared-auth-ticket-keys\"),
(builder) => { builder.SetApplicationName(CookieConst.SHARED_APP_NAME); })
.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
CookieConst.AUTHENTICATION_TYPE,
"v2"))),
CookieManager = new ChunkingCookieManager()
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name";
}
Я не понимаю закомментированную часть иСвойство провайдера CookieAuthenticationOptions, поскольку я не использую Microsoft.Identity и не знаю, как прочитать cookie и «проанализировать» его, чтобы заполнить принципал ASP.NET MVC5.
Что я делаюнеправильно?Спасибо