为什么 ApiAuthorization 在 .NET 5 中不起作用

Dot*_*per 5 c# asp.net-core .net-5 asp.net-core-5.0

我从 3.1 版开始使用 .NET Core API 授权,在我将项目升级到 .NET 5 之前一直运行良好。更新后,我得到了一个NullReferenceException.

这是来自Startup.cs的代码:

配置服务

services.AddDbContext(options =>
    options.UseInMemoryDatabase("Databaase"));

services.AddDefaultIdentity()
    .AddEntityFrameworkStores();

services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = false;
        options.SaveToken = true;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = configuration["Jwt:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:SecretKey"])),
            ValidAudience = configuration["Jwt:Audience"],
            ValidateAudience = true,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero // Override the default clock skew of 5 mins
        };
    });
Run Code Online (Sandbox Code Playgroud)

配置

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
Run Code Online (Sandbox Code Playgroud)

这是我的DbContext

public class ApplicationDbContext : ApiAuthorizationDbContext
Run Code Online (Sandbox Code Playgroud)

数据库上下文构造函数

public ApplicationDbContext(DbContextOptions options, IOptions operationalStoreOptions, ICurrentUserService currentUserService, IDateTime dateTime) : base(options, operationalStoreOptions)
{
    _currentUserService = currentUserService;
    _dateTime = dateTime;
}
Run Code Online (Sandbox Code Playgroud)

我收到NullReferenceException以下错误详细信息:

Object reference not set to an instance of an object.
    Microsoft.Extensions.DependencyInjection.ConfigureApiResources.GetApiResources()+MoveNext()
    Microsoft.Extensions.DependencyInjection.ConfigureApiResources.Configure(ApiAuthorizationOptions options)
Run Code Online (Sandbox Code Playgroud)

编辑: GitHub 上提出的问题https://github.com/dotnet/aspnetcore/issues/28456

Dot*_*per 1

如果有人正在寻找此问题的解决方案,根据更新中提供的 Github 链接,该问题已通过添加Key和解决.AddIdentityServerJwt()

密钥必须添加到appsettings.Development.json如下:

"IdentityServer": {
    "Key": {
      "Type": "Development"
    }
  }
Run Code Online (Sandbox Code Playgroud)

还修改Startup.cs为包括.AddIdentityServerJwt()

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddIdentityServerJwt()
    .AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = false;
        options.SaveToken = true;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = configuration["Jwt:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:SecretKey"])),
            ValidAudience = configuration["Jwt:Audience"],
            ValidateAudience = true,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero // Override the default clock skew of 5 mins
        };
    });
Run Code Online (Sandbox Code Playgroud)