2017-09-03 129 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

相关问题