C# 使用基于声明的有效JWT保护webapi
这是我创建基于声明的授权属性的方式。但我对这是如何工作的有些怀疑 给定我的startup类中的代码: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
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不会直接验证,但它会检查用户是否经过身份验证,如果他们没有有效的令牌,就不会进行身份验证