Authentication 将JWT连接到控制器中的用户属性
我有一个WebAPI.NETCore3.0服务。它获取一个包含JWT和声明的头 我将以下内容添加到Startup.cs中的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
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)]
我需要做什么才能让用户属性(控制器基类的一部分)填充我的声明?我怀疑您的配置有问题。在
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();
});
}
请出示完整的
配置方法代码!