以前、こちらの内容で質問させていただきご回答を頂戴いたしました。
https://teratail.com/questions/306307
サイトA(ASP.NET MVC 5)からサイトB(ASP.NET MVC 5)やサイトC(ASP.NET CORE 5)を呼び出す際、
サイトAでのサインイン情報をBまたはCにも引き継ぐ事をしたいのが目的です。
今回の対応(ロジック変更)としまして、ご回答いただいた以下を参考にいたしました。
https://docs.microsoft.com/ja-jp/aspnet/core/security/cookie-sharing?view=aspnetcore-5.0#share-authentication-no-loccookies-between-aspnet-4x-and-aspnet-core-apps
以下、改修内容を以下の書かせていただきますが、
この仕様はログインページの「Remember Me」にチェックを付ける事が前提という認識でよろしかったでしょうか。
今回、ログインページの「Remember Me」チェックボックスは非表示化し、
(ASP.NET MVC側の)AccountControllerのLoginアクションのPasswordSignInAsyncも、以下のように強制的にRemember Meをtrueにしております。
SignInStatus result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
↓
SignInStatus result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, true, shouldLockout: false);
私の認識が間違っている場合、お手数ですがご指摘の程お願い申し上げます。
【ASP.NET MVC側】
IdentityModels.cs
public class ApplicationUser : IdentityUser { public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { var userIdentity = await manager.CreateIdentityAsync(this, "Identity.Application"); return userIdentity; } }
Startup.Auth.cs
app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "Identity.Application", CookieName = ".Hoge.SharedCookie", 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\"), (builder) => { builder.SetApplicationName("SharedCookieApp"); }) .CreateProtector( "Microsoft.AspNetCore.Authentication.Cookies." + "CookieAuthenticationMiddleware", "Identity.Application", "v2"))), CookieManager = new Microsoft.Owin.Security.Interop.ChunkingCookieManager(), SlidingExpiration = true, ExpireTimeSpan = TimeSpan.FromMinutes(43200) }); System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"; app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
【ASP.NET CORE側】
IdentityHostingStartup.cs
services.Configure<SecurityStampValidatorOptions>(options => { options.ValidationInterval = TimeSpan.FromMinutes(30); }); services.AddAuthorization(options => { options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("admin, user")); });
Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.Configure<IdentityOptions>(options => { options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequiredLength = 6; options.Password.RequiredUniqueChars = 1; options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); options.Lockout.MaxFailedAccessAttempts = 5; options.Lockout.AllowedForNewUsers = true; options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; options.User.RequireUniqueEmail = false; }); services.ConfigureApplicationCookie(options => { options.Cookie.Name = ".Hoge.SharedCookie"; options.Cookie.Path = "/"; options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromMinutes(43200); options.Cookie.IsEssential = true; options.Cookie.SameSite = SameSiteMode.None; options.LoginPath = "/Identity/Account/Login"; options.AccessDeniedPath = "/Identity/Account/AccessDenied"; options.SlidingExpiration = true; }); services.AddDataProtection() .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\")) .SetApplicationName("SharedCookieApp"); services.AddControllersWithViews(); }
以上、よろしくお願い申し上げます。
あなたの回答
tips
プレビュー