我已将SSO
实施到我的api(web-api 2
),并且正确验证了令牌。但现在我必须添加基于声明的授权属性。在访问令牌中,我有:
"MyClaim.Read.All": "true"
我希望实现以下目标:
[ClaimAuthorizationAttribute("MyClaim.Read.All")]
public sealed class MerchantProfileController : ApiController
因此,如果令牌不包含此声明,我会发出401
错误。
如何实现这一点,所以我可以将此属性用于我想要的任何控制器吗?
答案 0 :(得分:0)
所以我创建了一个授权属性:
[AttributeUsage(AttributeTargets.All)]
public sealed class ClaimAuthorizationAttribute : AuthorizeAttribute
{
/// <summary>
/// Gets or sets the claim to check in the web token
/// </summary>
public string Claim { get; set; }
/// <inheritdoc/>
protected override bool IsAuthorized(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException(nameof(actionContext));
}
var decoder = new JwtSecurityTokenHandler();
var token = (JwtSecurityToken)decoder.ReadToken(actionContext.Request.Headers.Authorization.Parameter);
return token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase));
}
}
这里适用于控制器:
[ClaimAuthorization(Claim = "MyClaim.Read.All")]