2017-09-03 127 views
0

當使用新的AddJwtBearer時,我無法使任何示例工作。我有授權歸於一個HomeController的:當使用.NET Core 2的AddJwtBearer時,授權屬性不會重定向到登錄頁面

[Authorize] 
public class HomeController : Controller 
{ 
    public IActionResult Index() 
    { 
     return View(); 
    } 
} 

我嘗試新的ASP.NET核心AddJwtBearer,我有這樣的代碼在ConfigureServices只是services.AddMvc()之前:

services.AddAuthentication(opts => 
{ 
    opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
    opts.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
    opts.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
}) 
.AddJwtBearer(opts => 
{ 
    opts.RequireHttpsMetadata = false; 
    opts.SaveToken = true; 
    opts.TokenValidationParameters = new TokenValidationParameters() 
    { 
     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysupersecretkey")), 
     ValidIssuer = "issuer, 
     ValidAudience = "audience", 
     ValidateIssuerSigningKey = true, 
     ValidateLifetime = true, 
    }; 
}); 

和在啓動時配置方法,我只是app.UseMvc()之前有這個

app.UseAuthentication(); 

,我希望它重定向到登錄頁面(不具有授權的屬性),所以我可以進入用戶N ame和密碼,然後創建一個令牌以供成功使用,但我總是被重定向到一個空白頁面。

我試着用郵差導航首頁/指數,身體是空的,並在標題有:

WWW-Authenticate →Bearer error="invalid_token", error_description="The token is expired" 

如果我使用Cookie身份驗證,它重定向到登錄頁面。在之前的版本(UseJwtBearerAuthentication)中,這個重定向允許我輸入密碼並獲得令牌。

我是否期待錯誤的行爲,或者我錯過了什麼?

回答

2

我想你會錯誤的行爲。調用API時,主要使用JWT承載令牌。用另一個應用程序調用您的API並不是非常有用。 HttpClient獲取重定向作爲響應。 401挑戰直接告訴調用者他們需要認證。

如果您有使用此API的前端JavaScript,則應該在該處添加401狀態碼的檢查,並重定向到客戶端的登錄頁面。

你可以看到源代碼在這裏:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerHandler.cs#L194

它設置了一個401個狀態碼,並返回正確的錯誤。

雖然,看代碼,我想你可能也做從服務器端重定向,通過使用OnChallenge事件。就個人而言,我不會除了一個API來重定向到登錄頁面。

+0

謝謝,根據我的理解,我應該根據回覆重新定向自己。關於您的聲明的一個問題「調用API時主要使用JWT承載令牌」:JWT是否也使用了我想要使用它們的方式,而不是調用API,而是從控制器調用Action Methodods? –

+0

你的意思是從同一個應用程序調用一個動作?在這種情況下,將邏輯移至服務層並調用相同的服務層會更好。如果你的意思是在另一個應用程序中的行爲,那麼是的,這將是一個典型的用於像JWT這樣的令牌的用例。 – juunas

相關問題