ResourceAuthorize(" Read"," UsersList")无效,ResourceAuthorizationManager

时间:2016-04-28 10:23:37

标签: asp.net-web-api thinktecture-ident-server identityserver3 asp.net-authorization thinktecture-ident-model

我正在使用IdentityServer3发出令牌并尝试使用Thinktecture.IdentityModel.Owin.ResourceAuthorization.WebApi来授权对web api进行资源访问。

我使用下面的代码来授权控制器的操作。

[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没有角色声明。我在注册用户时不存储用户声明。如何在旅途中为经过身份验证的用户添加声明?

1 个答案:

答案 0 :(得分:1)

也许这会对其他人有所帮助。

基本上,在将API定义为范围时,我在范围声明映射中缺少'角色'声明。您只需列出作为范围一部分的所有声明,IdentityServer将处理其余部分。

在身份服务器端:

new Scope
{
    Enabled = true,
    Name = "ScopeName",
    Type = ScopeType.Identity,
    Claims = new List<ScopeClaim>
    {
        new ScopeClaim("role")
    }
}