openid:创建基于声明的授权属性

时间:2017-02-02 16:15:55

标签: c# asp.net-web-api2 single-sign-on openid claims-based-identity

我已将SSO实施到我的api(web-api 2),并且正确验证了令牌。但现在我必须添加基于声明的授权属性。在访问令牌中,我有:

 "MyClaim.Read.All": "true"

我希望实现以下目标:

[ClaimAuthorizationAttribute("MyClaim.Read.All")]
public sealed class MerchantProfileController : ApiController

因此,如果令牌不包含此声明,我会发出401错误。

如何实现这一点,所以我可以将此属性用于我想要的任何控制器吗?

1 个答案:

答案 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")]