使用.NET Core 2的AddJwtBearer

时间:2017-09-03 11:13:14

标签: asp.net-core asp.net-core-mvc

使用新的AddJwtBearer时,我无法使任何样本生效。我有一个归属于授权的HomeController:

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

我正在尝试使用新的ASP.NET Core AddJwtBearer,我在的服务.AddMvc()之前在ConfigureServices中有这个代码:

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

在Startup中的Configure方法中,我在app.UseMvc()

之前就已经有了这个
app.UseAuthentication();

我原本希望它重定向到Login页面(没有Authorize属性)所以我可以输入用户名和密码,然后创建一个令牌以便成功使用,但我总是被重定向到空白页面。

我尝试使用邮递员导航Home / Index,正文是空的,标题中有:

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

如果我使用Cookie身份验证,则会重定向到“登录”页面。在之前的版本(UseJwtBearerAuthentication)中,重定向允许我输入密码并获取令牌。

我是否期待错误的行为,或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

我认为你期待错误的行为。 JWT承载令牌主要用于调用API。对于使用例如调用您的API的其他应用来说,它不是非常有用HttpClient获取重定向作为响应。 401挑战直接告诉呼叫者他们需要进行身份验证。

如果你有使用这个API的前端JavaScript,你应该在那里添加401状态代码的检查,并从客户端重定向到登录页面。

您可以在此处查看源代码:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerHandler.cs#L194

它设置401状态代码并返回正确的错误。

虽然看着代码,但我猜你可以通过使用OnChallenge事件从服务器端进行重定向。就个人而言,我不会将API重定向到登录页面。