Identity 3-хранить утверждения в базе данных, но не файлы cookie



In.net core Identity 3-Можно ли по умолчанию не хранить утверждения пользователей или роли в файле cookie Identity, а хранить их только в базе данных?



Другими словами, если вы хотите получить доступ к утверждениям, вам придется загрузить их явно.

Не удалось выяснить, как настроить это, используя встроенную функциональность Identity и схему по умолчанию.

589   2  

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

    Ничего не найдено.