Проверка подлинности Windows Asp.net core 2 авторизация роли базы данных - PullRequest
0 голосов
/ 07 июня 2018

Я работаю над приложением для интрасети, которое будет использовать Asp.Net Core 2.1 и проверку подлинности Windows.Я просто передаю данные из IIS, но хочу использовать для авторизации роли, хранящиеся в базе данных.

У меня есть класс IClaimsTransformeration, который получает роли из базы данных на основе идентификатора локальной сети и добавляетих в список утверждений с ключом роли.

public class MyClaimsTransformer : IClaimsTransformation
{
    private readonly IUnitOfWorkMtuSecurity _unitOfWork;

    public MyClaimsTransformer(IUnitOfWorkMtuSecurity unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    // Each time HttpContext.AuthenticateAsync() or HttpContext.SignInAsync(...) is called the claims transformer is invoked. So this might be invoked multiple times. 
    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var identity = principal.Identities.FirstOrDefault(x => x.IsAuthenticated);
        if (identity == null) return principal;

        //var user = await _userManager.GetUserAsync(principal);
        var user = identity.Name;
        if (user == null) return principal;

        //Get user with roles from repository.
        var dbUser = _unitOfWork.UserInformations.GetUserWithRoles(user);

        // Inject DbRoles into Claims list
        foreach (var role in dbUser.UserInformationUserRoles.Select((r=>r.UserRole)))
        {
            var claim = new Claim(ClaimTypes.Role, role.Name);
            identity.AddClaim(claim);
        }

        return new ClaimsPrincipal(identity);
    }  
}

Я добавил IClaimsTransformation в мои службы в автозагрузке .cs

services.AddScoped<IClaimsTransformation, MyClaimsTransformer>();

Затем я добавил атрибут в свой контроллер

[Authorize(Roles = "Administrator")]

Когда я запускаю свое приложение, я получаю следующую ошибку:

Произошло необработанное исключение при обработке запроса.InvalidOperationException: не указана схема authenticationScheme, и не найден DefaultForbidScheme.Microsoft.AspNetCore.Authentication.AuthenticationService.ForbidAsync (контекст HttpContext, строковая схема, свойства AuthenticationProperties)

В файле startup.cs я добавил следующее к службам

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Этоизбавился от ошибки, но независимо от того, что я получаю ошибку 403.

У вас нет прав для просмотра этой страницы.HTTP ERROR 403

Когда я смотрю возвращаемое значение из MyClaimsTransformer, я вижу, что роль администратора была добавлена ​​в список заявок, но независимо от того, что я получаю ошибку 403.

У кого-нибудь есть предложения по поводу того, что мне не хватает?

Если я использую следующий синтаксис в моем представлении, он работает на уровне представления:

 @if (User.HasClaim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "Administrator"))
                    {
                <li><a asp-area="" asp-controller="UserInformationAdmin" asp-action="Index">Admin</a></li>
                     } 

У меня естьчтобы указать URL-адрес всей схемы.

1 Ответ

0 голосов
/ 12 июня 2018

ClaimIdentity имеет RoleClaimType «http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid"

» и должен быть RoleClaimType «http://schemas.microsoft.com/ws/2008/06/identity/claims/role"

Поскольку это свойство только для чтения, я изменил метод TransformAsync насоздайте новый ClaimsPrincipal вместо попытки добавить роли базы данных к существующим утверждениям.Мое приложение не требует каких-либо групп AD, поэтому оно использует только окна для аутентификации.Код ниже, кажется, работает.

public class MyClaimsTransformer : IClaimsTransformation
{
    private readonly IUnitOfWorkSecurity _unitOfWork;

    public MyClaimsTransformer(IUnitOfWorkSecurity unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    // Each time HttpContext.AuthenticateAsync() or HttpContext.SignInAsync(...) is called the claims transformer is invoked. So this might be invoked multiple times. 
    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var identity = principal.Identities.FirstOrDefault(x => x.IsAuthenticated);
        if (identity == null) return principal;

        var user = identity.Name;
        if (user == null) return principal;

        //Get user with roles from repository.
        var dbUser = _unitOfWork.UserInformations.GetUserWithRoles(user);

        var claims = new List<Claim>();

        //The claim identity uses a claim with the claim type below to determine the name property.
        claims.Add(new Claim(@"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", user, "Name"));

        //todo: We should probably create a cache for this
        // Get User Roles from database and add to list of claims.
        foreach (var role in dbUser.UserInformationUserRoles.Select((r=>r.UserRole)))
        {
            claims.Add(new Claim(ClaimTypes.Role, role.Name));
        }

        var newClaimsIdentity = new ClaimsIdentity(claims,"Kerberos","", "http://schemas.microsoft.com/ws/2008/06/identity/claims/role");

        var newClaimsPrincipal = new ClaimsPrincipal(newClaimsIdentity);

        return new ClaimsPrincipal(newClaimsPrincipal);
    }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...