Authentication 将JWT连接到控制器中的用户属性

Authentication 将JWT连接到控制器中的用户属性,authentication,asp.net-core,jwt,asp.net-core-3.0,Authentication,Asp.net Core,Jwt,Asp.net Core 3.0,我有一个WebAPI.NETCore3.0服务。它获取一个包含JWT和声明的头 我将以下内容添加到Startup.cs中的ConfigureServices,以将JWT映射到.NET核心身份验证系统: services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(configureOptions => { configureOptions.Events = new JwtBearer

我有一个WebAPI.NETCore3.0服务。它获取一个包含JWT和声明的头

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

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(configureOptions =>
{
    configureOptions.Events = new JwtBearerEvents()
    {
        OnMessageReceived = context =>
        {
            context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
            return Task.CompletedTask;
        }
    };
});
我还添加了
app.UseAuthentication()
到Startup.cs中的
配置

然后启动我的服务并对其调用HTTP GET操作。当我这样做时,我可以看到
context.Token
被设置为我的JWT。如果我把JWT交给它,就表明它有很多主张

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

以下是我尝试过的一些变体:

  • 在我的控制器上方添加
    [Authorize]

    结果:401错误:未经授权
  • 在我的控制器上方添加
    [授权(JwtBearerDefaults.AuthenticationScheme)]

    结果:未找到名为“承载者”的授权策略
  • 在ConfigureServices中添加
    services.AddAuthorization()
    ,并在我的控制器上方添加
    [Authorize]

    结果:401错误:未经授权
  • 在我的控制器上方添加
    [授权(JwtBearerDefaults.AuthenticationScheme)]
    并在下面添加代码以配置服务:
services.AddAuthorization(auth=> { auth.AddPolicy(JwtBearerDefaults.AuthenticationScheme, 新授权PolicyBuilder().requireAuthenticationDuser().Build()); }); 结果:401错误:未经授权

明确地说,我不想进行任何授权,但我了解到添加授权可能需要将声明映射到用户


我需要做什么才能让用户属性(控制器基类的一部分)填充我的声明?

我怀疑您的配置有问题。在
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"]))
    };
});
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();
    });
}
然后在
Configure
方法中,应如下所示:

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"]))
    };
});
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();
    });
}

请出示完整的
配置
方法代码!