2017-02-21 113 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

@布達不是直接,但它確實檢查是否用戶通過身份驗證,如果他們沒有有效的令牌,則不會出現這種情況 –