Identity 3-хранить утверждения в базе данных, но не файлы cookie
In.net core Identity 3-Можно ли по умолчанию не хранить утверждения пользователей или роли в файле cookie Identity, а хранить их только в базе данных?
Другими словами, если вы хотите получить доступ к утверждениям, вам придется загрузить их явно.
Не удалось выяснить, как настроить это, используя встроенную функциональность Identity и схему по умолчанию.
2 ответов:
Я все еще мог использовать встроенную таблицу AspNetRoleClaims, но не включать их в файл cookie, переопределяя класс UserClaimsPrincipalFactory. Опять же причина этого в том, что у меня много претензий на роль, и печенье становилось слишком большим.
Я создал свой собственный класс AppClaimsPrincipalFactory, который наследует от UserClaimsPrincipalFactory и переопределяет метод CreateAsync:
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole> { public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor) { } public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } var userId = await UserManager.GetUserIdAsync(user); var userName = await UserManager.GetUserNameAsync(user); var id = new ClaimsIdentity(Options.Cookies.ApplicationCookieAuthenticationScheme, Options.ClaimsIdentity.UserNameClaimType, Options.ClaimsIdentity.RoleClaimType); id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId)); id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, userName)); if (UserManager.SupportsUserSecurityStamp) { id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType, await UserManager.GetSecurityStampAsync(user))); } // code removed that adds the role claims if (UserManager.SupportsUserClaim) { id.AddClaims(await UserManager.GetClaimsAsync(user)); } return new ClaimsPrincipal(id); } }При Запуске.cs ConfigureServices, я затем регистрирую это в контейнере, как Итак:
services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // override UserClaimsPrincipalFactory (to remove role claims from cookie ) services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
Другой вариант-не реализовывать интерфейс IUserClaimStore в реализации UserStore. Реализация по умолчанию, входящая в состав пакета EF, реализует этот интерфейс, поэтому утверждения сохраняются и извлекаются автоматически.
Comments