将JWT连接到Controller中的User属性

时间:2019-10-28 23:43:12

标签: authentication asp.net-core jwt asp.net-core-3.0

我有一个Web API .NET Core 3.0服务。它获得的标头包含带有声明的JWT。

我在Startup.cs的ConfigureServices中添加了以下内容,以将JWT映射到.NET Core身份验证系统:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(configureOptions =>
{
    configureOptions.Events = new JwtBearerEvents()
    {
        OnMessageReceived = context =>
        {
            context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
            return Task.CompletedTask;
        }
    };
});

我还在Startup.cs中将app.UseAuthentication();添加到了Configure

然后我启动服务并对其调用HTTP GET操作。完成后,可以看到context.Token设置为我的JWT。如果我将JWT移至https://JWT.io,则表明它有很多主张。

但是GET操作中的一个断点表明User.Claims为空。将JWT连接到用户所需的一切都没有发生。

这是我尝试过的变体:

  • 在我的控制器上方添加[Authorize]
    结果: 401错误:未经授权
  • 在我的控制器上方添加[Authorize(JwtBearerDefaults.AuthenticationScheme)]
    结果:找不到名为'Bearer'的AuthorizationPolicy。
  • 在ConfigureServices中添加services.AddAuthorization(),并在控制器上方添加[Authorize]
    结果: 401错误:未经授权
  • [Authorize(JwtBearerDefaults.AuthenticationScheme)]添加到我的控制器上方,并将下面的代码添加到ConfigureServices中:
    services.AddAuthorization(auth =>
    {
        auth.AddPolicy(JwtBearerDefaults.AuthenticationScheme, 
            new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build());
    });

结果: 401错误:未经授权

要清楚,我不想做任何授权,但我读到,可能需要添加权限才能将声明映射到用户。

我需要做什么才能使User属性(属于Controller基类的一部分)填充我的声明?

1 个答案:

答案 0 :(得分:1)

我怀疑您的配置有问题。在ConfigureServices方法中,应如下所示:

services.AddAuthentication(options =>
{
   options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
   options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
       ValidateIssuer = true,
       ValidateAudience = true,
       ValidateLifetime = true,
       ValidateIssuerSigningKey = true,
       ValidIssuer = Configuration["Jwt:Issuer"],
       ValidAudience = Configuration["Jwt:Issuer"],
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
    };
});

然后在Configure方法中,它应如下所示:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...................

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization(); // These two must be before `UseEndpoints` and after `UseRouting`

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}