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

C# 使用基于声明的有效JWT保护webapi,c#,asp.net-web-api2,owin,jwt,claims-based-identity,C#,Asp.net Web Api2,Owin,Jwt,Claims Based Identity,这是我创建基于声明的授权属性的方式。但我对这是如何工作的有些怀疑 给定我的startup类中的代码: public void Configuration(IAppBuilder app) { if (app == null) { throw new ArgumentNullException(nameof(app)); } app.UseIdentityServerBearerTokenAuthen

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

给定我的startup类中的代码:

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
        });
    }
我希望如果我将此属性发送给我的控制器,并且我发送了一个无效的令牌(无效签名),那么请求将自动被拒绝,因为未经授权,但是属性中的代码将被执行

不应该先验证令牌吗


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

该问题在您的
ClaimeAuthorizationAttribute中的链接问题中-它从不调用
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;

从您之前的问题:如果您使用
return-token.Claims.Any
更改return语句
return-token.Claims.All
您仍然收到此错误吗?@Tinwor这将要求令牌上的所有声明都相同,与其只是检查其中是否有任何一个匹配,我考虑了这个选项,但我查看了源代码(),我发现这不会验证令牌…@Buda不会直接验证,但它会检查用户是否经过身份验证,如果他们没有有效的令牌,就不会进行身份验证