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

secure webapi with a valid JWT based on claims

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

根据我的启动代码 class:

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先验证令牌吗?

如何确保令牌有效(有效的结构、签名、未过期等)并且仅在验证声明后才有效?

问题出在您 ClaimAuthorizationAttribute 中的链接问题中 - 它从未调用 base.IsAuthorized(),因此绕过了 AuthorizeAttribute.[=15 提供的内置保护机制=]

而不是在查看声明是否存在后才返回这里:

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

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

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;