我正在使用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没有角色声明。我在注册用户时不存储用户声明。如何在旅途中为经过身份验证的用户添加声明?
答案 0 :(得分:1)
也许这会对其他人有所帮助。
基本上,在将API定义为范围时,我在范围声明映射中缺少'角色'声明。您只需列出作为范围一部分的所有声明,IdentityServer将处理其余部分。
在身份服务器端:
new Scope
{
Enabled = true,
Name = "ScopeName",
Type = ScopeType.Identity,
Claims = new List<ScopeClaim> { new ScopeClaim("role") }
}