使用基于声明的有效JWT保护webapi

时间:2017-02-21 09:11:29

标签: c# asp.net-web-api2 owin jwt claims-based-identity

Here是我创建基于声明的授权属性的方式。但我对这项工作有些怀疑。

鉴于我的启动类的代码:

public void Configuration(IAppBuilder app)
    {
        if (app == null)
        {
            throw new ArgumentNullException(nameof(app));
        }

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["Authentication:Authority"],
            RequiredScopes = ConfigurationManager.AppSettings["Authentication:Scopes"].Split(' ').ToList(),
            PreserveAccessToken = true
        });
    }

我原以为如果我将此属性发送到我的控制器并发送无效令牌(无效签名),则该请求将被自动拒绝为未授权,但该属性的代码将被执行。

不应该OWIN首先验证令牌吗?

如何确认令牌有效(有效限制,签名,未过期等)并且仅在验证声明后?

1 个答案:

答案 0 :(得分:0)

问题出在您ClaimAuthorizationAttribute中的关联问题中 - 它不会调用base.IsAuthorized(),因此会绕过AuthorizeAttribute提供的内置保护机制。

在查看索赔是否存在之后,而不是仅仅返回此处:

return token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase));

您应该继续确保基类满足,因此令牌本身也是有效的:

var claimValid = token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase));
if (claimValid)
    return base.IsAuthorized();
else
    return false;