我有一个简单的 JWT 身份验证示例,您可以在其中找到它 here
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
如您所见,我添加了 JwtBearerDefaults.AuthenticationScheme
到 Authentication
内Startup/ConfigureServices
方法所以我应该可以使用 [Authorize]
独立 如下[Authorize]
public sealed class WeatherForecastController : BaseController
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
但我不知道为什么它不起作用! (我已经用 postman 测试过)。我必须通过 AuthenticationSchemes
定义它.[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public sealed class WeatherForecastController : BaseController
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
任何人都可以指导我如何使用Authorize
独立属性 没有 AuthenticationSchemes
特别是当我在 ConfigureServices
中定义它时?我设置错了什么?
最佳答案
您的代码没有 app.UseAuthentication()
包括。所以这意味着没有身份验证中间件。
默认身份验证方案仅由身份验证中间件用于自动验证请求并构建当前主体。当您使用 [Authorize]
单独地,未设置身份验证方案并且授权过滤器将不起作用。基于该过滤器构建的过滤器 IAuthorizeData
( AuthorizeAttribute
是 IAuthorizeData
)是 AuthorizeFilter
这需要明确设置方案。
这就是为什么另一个 [Authorize(...)]
一些方案集有效但不是 [Authorize]
.
所以你应该使用认证中间件来使用[Authorize]
方便,无需指定方案。AuthorizeFilter
将使用 IPolicyEvaluator
在内部验证请求,这里是 PolicyEvaluator.AuthenticateAsync 的默认实现- 你可以看到它检查 AuthenticationSchemes
的可用性.
关于c# - 为什么我应该始终为我的 Authorize 属性定义 JwtBearerDefaults.AuthenticationScheme?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66939641/