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
首先验证令牌吗?
如何确认令牌有效(有效限制,签名,未过期等)并且仅在验证声明后?
答案 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;