将 JWT 连接到控制器中的用户 属性
Connect a JWT to the User property in the Controller
我有一个 Web API .NET Core 3.0 服务。它得到一个 header,其中包含一个带有声明的 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 错误:未经授权
明确地说,我不想做任何授权,但我读到可能需要添加它才能将声明映射到用户。
我需要做什么才能让用户 属性(控制器基础 class 的一部分)填充我的声明?
我怀疑你的配置有问题。在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();
});
}
我有一个 Web API .NET Core 3.0 服务。它得到一个 header,其中包含一个带有声明的 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 错误:未经授权
明确地说,我不想做任何授权,但我读到可能需要添加它才能将声明映射到用户。
我需要做什么才能让用户 属性(控制器基础 class 的一部分)填充我的声明?
我怀疑你的配置有问题。在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();
});
}