Как привязать пользователя ASP. NET Core Identity к идентификатору участника в Windows Authentication - PullRequest
0 голосов
/ 27 мая 2020

У меня есть веб-приложение. NET Core 3.1, работающее в среде Active Directory, поэтому основная аутентификация просто выполняется с использованием опции IISDefault

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Что касается авторизации, у меня есть SQL Серверная база данных, в которой я храню дополнительную информацию о пользователях, такую ​​как роли и разрешения, которые добавляются к аутентифицированному пользователю (в форме объекта ClaimsPrincipal) посредством настраиваемой реализации интерфейса IClaimsTransformation:

public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
    if (principal == null || !principal.Identity.IsAuthenticated) return principal;

    // retrieve those users additional info and transforms them into claims
    // ContextUser is an injected dummy user based on the current environment
    Task<IList<Claim>> applicationUserClaims = GetApplicationClaimsAsync(ContextUser.ContextUserId);

    ClaimsIdentity contextIdentity;
    if (ContextUser.ContextUserId != principal.Identity.Name)
    {
        List<Claim> idClaim = new List<Claim>() 
        {
            new Claim(ClaimTypes.Name, ContextUser.ContextUserId) 
        };
        contextIdentity = new ClaimsIdentity (idClaim);
    }
    else
    {
        contextIdentity = principal.Identity as ClaimsIdentity;
        contextIdentity.AddClaims(principal.Claims);
    }
    contextIdentity.AddClaims(await applicationUserClaims);

    ClaimsPrincipal contextPrincipal = new ClaimsPrincipal(contextIdentity);

    return contextPrincipal;
}

После этого будут доступны дополнительные утверждения для настраиваемых определений политик, таких как

services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy => 
        policy.RequireClaim("http://archiviocian/role", "ADMIN"));
}

Я хотел добавить настраиваемого ASP. NET поставщика хранилища Core Identity и, следуя предоставлена ​​документация , я создал свой собственный Identity Manager и Identity Store. Теперь я нахожусь в странном положении, так как у меня есть два разных типа личности: один, доступный через HttpContext.User, и другой, доступный через UserManager<AppUser>, и это плохо пахнет. Много.

Как связать их вместе, особенно для целей определения политики, учитывая, что определение настраиваемой политики кажется, работает только с ClaimPrincipal, связанным с каждым запросом?

...