Мой вопрос состоит из двух частей. Я выполняю миграцию приложения на. 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 из контекста.
Заранее спасибо