2

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

4

1 回答 1

1

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

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

在身份服务器端:

new Scope
{
    Enabled = true,
    Name = "ScopeName",
    Type = ScopeType.Identity,
    Claims = new List<ScopeClaim>
    {
        new ScopeClaim("role")
    }
}
于 2016-05-31T14:10:59.387 回答