2017-02-21 111 views
2

Here是我如何创建基于声明的授权属性。但我对这项工作有些怀疑。安全webapi与基于声明的有效智威汤逊

由于代码从我的启动类:

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 
     }); 
    } 

我期待,如果我有这样的属性我控制器和I发送一个无效的令牌(无效签名)的请求将被自动拒绝未经授权的,但是来自该属性的代码被执行。

不应该OWIN首先验证令牌吗?

如何确保令牌有效(有效的狭窄,签名,未过期等),并且只有在验证了声明之后?

+0

从你以前的问题:如果你改变返回语句'返回token.Claims.Any'与'返回token.Claims.All'你仍然得到这个错误? – Tinwor

+0

@Tinwor这将要求所有令牌的声明是相同的,而不是仅仅检查它们中的任何一个是否匹配 –

回答

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; 
+0

我在考虑这个选项,但后来我查看了源代码(https:// github我看到,这不会验证令牌... –

+0

@布达不是直接,但它确实检查是否用户通过身份验证,如果他们没有有效的令牌,则不会出现这种情况 –