Добавить или удалить роли для текущего пользователя при отладке в ядре asp.net с использованием Identity? - PullRequest
0 голосов
/ 17 октября 2019

Я хотел бы изменить роль текущего зарегистрированного пользователя в целях тестирования, я не знаю, где я могу это сделать и как добавлять и удалять заявки в текущей коллекции заявок

1 Ответ

1 голос
/ 17 октября 2019

Один из подходов состоит в том, чтобы зарегистрировать пользовательский IClaimsTransformation, где вы можете создать пользовательский принципал и изменить его личность / требования / роли по мере необходимости.

Служба IClaimsTransformation, если она существует, будет вызвана после успешной аутентификации запроса.

Я создаю пользовательское преобразование, которое вступает в силу только в среде разработки, как показано ниже:

public class CustomClaimsTransformation : IClaimsTransformation
{
    private readonly IHostingEnvironment env;

    // if you're using 3.0, use `IWebHostEnvironment` instead
    public CustomClaimsTransformation(IHostingEnvironment env) 
    {
        this.env = env;
    }

    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        if (!NeedChangeClaims(principal)) 
            return Task.FromResult(principal);

        var identity = principal.Identity as ClaimsIdentity;
        // filter claims (i.e. remove claims)
        var claims= identity.Claims
            .Where(c => !ShouldRemoveThisClaim(c));     
        // map a new identity
        identity = new ClaimsIdentity(claims, identity.AuthenticationType, identity.RoleClaimType,identity.NameClaimType);
        // add extra claims as you like
        identity.AddClaim(new Claim(ClaimTypes.StreetAddress,"NY"));

        return Task.FromResult(new ClaimsPrincipal(identity));
    }

    private bool NeedChangeClaims(ClaimsPrincipal cp) 
    {
        if (env.IsDevelopment()) { 
            return true;
        }
        return false;
    }

    private bool ShouldRemoveThisClaim(Claim c) 
    {
        if (c.Type == ClaimTypes.Role && c.Value == "FIAdmin")
            return true;
        if (c.Type == ClaimTypes.Role && c.Value == "HRAdmin")
            return true;
        if (c.Type == ClaimTypes.OtherPhone)
            return true;
        return false;
    }
}

Чтобы включить эту службу, нам также необходимо зарегистрировать ее при запуске:

services.AddDefaultIdentity<IdentityUser>()
    .AddDefaultUI(UIFramework.Bootstrap4)
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

services.AddSingleton<IClaimsTransformation, CustomClaimsTransformation>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...