使用基于声明的有效 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;
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;