![](/img/trans.png)
[英]How to authorize users by role in MVC Controllers using a JWT token obtained from ajax call
[英]How to Authorize Using JWT token
我有一個Web API端點,可以給我JWT令牌。 它不是完全授權服務器。 它只是可以生成一個JWT令牌。
現在,我有另一個用aspnet核心編寫的Web應用程序。 我在startup.cs中添加了以下幾行,以便可以使用收到的JWT令牌進行授權
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(configureOptions =>
{...});
我也有一個登錄表單(在Web應用程序中),用戶在其中輸入我發送到Web api並獲取令牌的用戶名和密碼。 為了保護Web應用程序中的任何控制器,我只需使用[Authorize]屬性。
一切工作正常,直到令牌過期。 該令牌壽命很短,但確實帶有刷新令牌。
我的問題是,如何檢測令牌(來自Web api)現在已過期,我需要使用刷新令牌來獲取一個新令牌。 我知道在javascript世界中,我可以截獲http請求並使用刷新令牌續訂令牌。
但是,如何在aspnet核心客戶端應用程序中執行此操作?
(注意:我不想使用任何身份驗證服務器,例如IdentityServer4等)
先感謝您!!
您可以完全實現您想要的:
services
.AddAuthentication()
.AddJwtBearer("Firebase", options =>
{
options.Authority = "https://securetoken.google.com/my-firebase-project"
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "my-firebase-project"
ValidateAudience = true,
ValidAudience = "my-firebase-project"
ValidateLifetime = true
};
})
.AddJwtBearer("Custom", options =>
{
// Configuration for your custom
// JWT tokens here
});
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
});
讓我們看一下您的代碼與該代碼之間的區別。
AddAuthentication沒有參數如果您設置了默認身份驗證方案,則在每個單個請求中,身份驗證中間件都會嘗試運行與默認身份驗證方案關聯的身份驗證處理程序。 由於我們現在有兩種可行的身份驗證方案,因此運行其中一種是沒有意義的。
使用AddJwtBearer的另一個重載每個添加身份驗證的AddXXX方法都有幾個重載:
如其中所示,其中使用了與身份驗證方法關聯的默認身份驗證方案,用於cookie身份驗證。除了選項的配置之外,還通過了一個身份驗證方案的名稱,就像在此重載上一樣。您兩次使用相同的身份驗證方法,但是身份驗證方案必須唯一,您需要使用第二個重載。
更新默認策略由於將不再自動驗證請求,因此在某些操作上添加[Authorize]屬性將導致請求被拒絕並發出HTTP 401。
由於這不是我們想要的,因為我們希望給身份驗證處理程序一個機會來驗證請求,因此我們通過指示應同時嘗試Firebase和Custom身份驗證方案來驗證請求來更改授權系統的默認策略。
但這並不妨礙您對某些動作有更多的限制; [Authorize]屬性具有AuthenticationSchemes屬性,該屬性使您可以覆蓋哪些身份驗證方案有效。
如果您有更復雜的方案,則可以使用基於策略的授權。 我發現官方文檔很棒。
假設某些操作僅適用於Firebase發行的JWT令牌,並且必須具有特定值的聲明; 您可以這樣進行:
services
.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase", "Custom")
.Build();
options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("Firebase")
.RequireClaim("role", "admin")
.Build());
});
然后,您可以對某些操作使用[Authorize(Policy = "FirebaseAdministrators")]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.