我有一个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]
:[Authorize(JwtBearerDefaults.AuthenticationScheme)]
services.AddAuthorization()
,并在控制器上方添加[Authorize]
[Authorize(JwtBearerDefaults.AuthenticationScheme)]
添加到我的控制器上方,并将下面的代码添加到ConfigureServices中:services.AddAuthorization(auth => { auth.AddPolicy(JwtBearerDefaults.AuthenticationScheme, new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()); });
结果: 401错误:未经授权
要清楚,我不想做任何授权,但我读到,可能需要添加权限才能将声明映射到用户。
我需要做什么才能使User属性(属于Controller基类的一部分)填充我的声明?
答案 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();
});
}