Я выполнил настройку, предложенную в этой статье. https://learn.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-5.0#share-authentication-cookies-between-aspnet-4x-and-aspnet-core- приложения
Я устанавливаю файл cookie аутентификации, войдя в приложение .net 4x, а затем пытаюсь получить доступ к классу страницы, который защищен атрибутом [Authorize]
в основном приложении .net 5. Это не удается, и я возвращаюсь на страницу входа. Если я удалю атрибут [Authorize]
и получу и расшифрую общий файл cookie аутентификации, я смогу увидеть пользователя и утверждения, созданные приложением .net 4x, в AuthenticationTicket (см. код ниже), но при попытке получить доступ к пользователю ClaimsPrincipal на странице . этот Пользователь не имеет никаких данных в соответствии с файлом cookie. var user = _userManager.GetUserAsync(User).Result;
всегда нулевой.
var dataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\temp\keyring"));
var cookieManager = new ChunkingCookieManager();
var cookie = cookieManager.GetRequestCookie(HttpContext, ".AspNetCore.SharedCookie");
var dataProtector = dataProtectionProvider.CreateProtector
("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Identity.Application", "v2");
//Get teh decrypted cookies as a Authentication Ticket
TicketDataFormat ticketDataFormat = new TicketDataFormat(dataProtector);
AuthenticationTicket ticket = ticketDataFormat.Unprotect(cookie);
var user = _userManager.GetUserAsync(User).Result;
Ниже приведен код configureservices в файле startup.cs в приложении .net 5.
....
services.AddDbContext<RosterDBContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("databaseconnection")
, sqlServerOptions => sqlServerOptions.CommandTimeout(120)
);
options.EnableSensitiveDataLogging();
});
services.AddIdentity<RosterUser, RosterRole>()
.AddEntityFrameworkStores<RosterDBContext>();
services.Configure<SecurityStampValidatorOptions>
(
options => {
options.ValidationInterval = TimeSpan.FromSeconds(10);
}
);
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\keyring"));
services.AddAuthentication("Identity.Application")
.AddCookie(config =>
{
config.Cookie.Name = ".AspNetCore.SharedCookie";
config.Cookie.Path = "/";
});
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Identity/Account/Login/";
});
services.AddHttpContextAccessor();
services.AddRazorPages();
Для всех, кто это видит - я смог решить эту проблему. Я удалил эти строки и заменил services.AddIdentity<RosterUser, RosterRole>() .AddEntityFrameworkStores<RosterDBContext>();
со следующим:
services.AddIdentityCore<IdentityUser>().AddRoles<IdentityRole>().AddSignInManager() .AddEntityFrameworkStores<RosterDbContext>();
Я удалил своего собственного пользователя удостоверения, чтобы устранить любые проблемы, если таковые возникали из-за пользователя, и использовал метод AddIdentityCore, а не AddIdentity. Это остановило ошибку, которую я продолжал получать, заявляя, что «Схема уже существует: Identity.Application» из-за этой строки .AddCookie("Identity.Application"
.
Также я добавил имя приложения в оба приложения:
.net 4x ,(builder) => { builder.SetApplicationName("cms-app"); })
и в приложении .net core .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\keyring")) .SetApplicationName("cms-app");