. NET Базовая пользовательская авторизация по параметрам метода Web API - PullRequest
0 голосов
/ 08 апреля 2020

Мой вопрос состоит из двух частей. Я выполняю миграцию приложения на. NET Core Identity Server 3.0 с использованием веб-API.

Поэтому использование стандартного атрибута [Authorize (Roles = "Admin, OtherRole")] в моем веб-интерфейсе API не работает. Он настроен на использование Entity Framework, и роли правильно устанавливаются в ClaimsIdentity на моей фабрике принципов утверждений, показанной ниже:

public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
    private readonly IAccountService accountService;

    public AppClaimsPrincipalFactory(
    UserManager<ApplicationUser> userManager,
    RoleManager<IdentityRole> roleManager,
    IOptions<IdentityOptions> optionsAccessor,
    IAccountService accountService) : base(userManager, roleManager, optionsAccessor)
    {
        this.accountService = accountService;
    }
    public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
    {
        var principal = await base.CreateAsync(user);

        var otherPropertyName= accountService.GetOtherPropertyName(user.Email);

        if (!string.IsNullOrWhiteSpace(otherPropertyName))
        {
            ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                new Claim("OtherPropertyName" , otherPropertyName)
            });
        }            

        return principal;
    }
} 

Мой второй вопрос: у меня есть код, подобный приведенному ниже:

[HttpGet]
[Route("api/admin/entity-details")]
[ApiRolesAuthorise(Roles = "OtherRole, Admin")]
public SomeDto GetDetails(int entityId)
{
    if (!this.IsAuthorisedForEntity(entityId))
    {
        throw new Exception("Unauthorised Request");
    }

    return admin.GetDetails(entityId);
}

Такое ощущение, что его можно привести в порядок, например,

[HttpGet]
[Route("api/admin/entity-details")]
[ApiRolesAuthorise(Roles = "OtherRole, Admin")]
[IsAuthorisedForResource("EntityX")]
public SomeDto GetDetails(int entityId)
{
    return admin.GetDetails(entityId);
}

Есть ли способ создать пользовательский атрибут авторизации, который учитывает параметры, передаваемые для поиска в моей пользовательской модели данных, независимо от того, У пользователя есть специальная претензия к этому ресурсу.

Я смотрел на Политики, но нет ничего, что могло бы продемонстрировать взятие entityId из контекста.

Заранее спасибо

...