2

Я использую IdentityServer3 для выдачи токенов и попытки использовать Thinktecture.IdentityModel.Owin.ResourceAuthorization.WebApi для авторизации доступа к ресурсам веб-api.ResourceAuthorize («Read», «UsersList») не работает, ResourceAuthorizationManager

Я использую приведенный ниже код для авторизации действия контроллера.

[ResourceAuthorize("Read","UsersList")] 

ResourceAuthorizationManager выглядит, как показано ниже.

public class MyAuthorizationManager : ResourceAuthorizationManager 
{ 
    /// <summary> 
    /// Verify Access Rights 
    /// </summary> 
    /// <param name="context"></param> 
    /// <returns></returns> 
    public override Task<bool> CheckAccessAsync(ResourceAuthorizationContext context) 
    { 
     switch (context.Resource.First().Value) 
     { 
      case "UsersList": 
       return AuthorizeUsersList(context); 
      default: 
       return Nok(); 
     } 
    } 

    private Task<bool> AuthorizeUsersList(ResourceAuthorizationContext context) 
    { 
     switch (context.Action.First().Value) 
     { 
      case "Read": 
       return Eval(context.Principal.HasClaim("role", "User")); 
      case "Write": 
       return Eval(context.Principal.HasClaim("role", "Owner")); 
      default: 
       return Nok(); 
     } 
    } 
} 

Однако, когда управление доходит до AuhtorizeUsersList, то context.Principal не имеет никаких претензий ролей. Я не сохраняю претензии пользователя при регистрации пользователя. Как я могу добавить претензии для аутентифицированного пользователя на ходу?

+0

Мой код выглядит как ваша, но метод CheckAccessAsync никогда не выполняется, даже если я поставил ResourceAuthorize' атрибут ' над действием контроллера, и я также настроил авторизацию с помощью 'app.UseResourceAuthorization (MyAuthorizationManager)'. Вы знаете, есть ли еще что-то, что мне нужно сделать, чтобы заставить это работать? –

+0

Я предполагаю, что это должно быть 'app.UseResourceAuthorization (новый MyAuthorizationManager()). – dudedev

+0

Чтобы добавить претензии на ходу, переопределите метод GetClaimsForUserAsync класса AbstractIdentityUserService (Axoom.Core.IdentityServer.Services) и добавьте там претензии. – dudedev

ответ

1

Возможно, это будет полезно для других людей.

В принципе, мне не хватало претензий «роль» в отображении свойств области, определяя API как область видимости. Вам просто нужно указать все претензии, которые вы хотите как часть области, а IdentityServer будет обрабатывать остальные.

На стороне сервера идентичности:

new Scope 
{ 
    Enabled = true, 
    Name = "ScopeName", 
    Type = ScopeType.Identity, 
Claims = new List<ScopeClaim> 
    { 
     new ScopeClaim("role") 
    } 
} 
Смежные вопросы