c# - 为什么我应该始终为我的 Authorize 属性定义 JwtBearerDefaults.AuthenticationScheme?

标签 c# asp.net-core jwt asp.net-identity

我有一个简单的 JWT 身份验证示例,您可以在其中找到它 here

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
如您所见,我添加了 JwtBearerDefaults.AuthenticationSchemeAuthenticationStartup/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 ( AuthorizeAttributeIAuthorizeData )是 AuthorizeFilter这需要明确设置方案。
这就是为什么另一个 [Authorize(...)]一些方案集有效但不是 [Authorize] .
所以你应该使用认证中间件来使用[Authorize]方便,无需指定方案。AuthorizeFilter将使用 IPolicyEvaluator在内部验证请求,这里是 PolicyEvaluator.AuthenticateAsync 的默认实现- 你可以看到它检查 AuthenticationSchemes 的可用性.

关于c# - 为什么我应该始终为我的 Authorize 属性定义 JwtBearerDefaults.AuthenticationScheme?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66939641/

相关文章:

C# - 像在 Java 的 Swing 中一样布置表单

c# - 如何使用 System.Reflection.Metadata 获取属性类型?

docker - .net 核心 - 使用 docker compose 构建错误

go - 使用 jwt-go 库 - key 类型无效

c# - 将缓存数据存储在本地

c# - Microsoft ASP.NET 和 Web 工具 2015 - DNX 和 DNVM

docker - 如何从命令行运行 VIsual Studio Docker 容器?在 VS 中有效,但在命令行中无效

c# - JwtSecurityTokenHandler 表示更改 1 个字符后 JWT 的签名有效

python-3.x - 如果使用 python 计算,JWT hs512 签名与 jwt.io 略有不同

c# - 在一个网站中抓取所有网页的最快方法