为什么 ApiAuthorization 在 .NET 5 中不起作用
Why does ApiAuthorization not work in .NET 5
我使用的是 .NET Core API 从 3.1 版开始的授权,在我将我的项目升级到 .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
};
});
配置
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
这是我的 DbContext
public class ApplicationDbContext : ApiAuthorizationDbContext
DbContext 构造函数
public ApplicationDbContext(DbContextOptions options, IOptions operationalStoreOptions, ICurrentUserService currentUserService, IDateTime dateTime) : base(options, operationalStoreOptions)
{
_currentUserService = currentUserService;
_dateTime = dateTime;
}
我收到 NullReferenceException
错误详细信息:
Object reference not set to an instance of an object.
Microsoft.Extensions.DependencyInjection.ConfigureApiResources.GetApiResources()+MoveNext()
Microsoft.Extensions.DependencyInjection.ConfigureApiResources.Configure(ApiAuthorizationOptions options)
编辑:
在 GitHub https://github.com/dotnet/aspnetcore/issues/28456
上提出的问题
你的 AddDefaultIdentity 应该是这样的
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
并删除
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
它应该可以工作
如果有人正在寻找此问题的解决方案,根据更新中提供的 Github link,问题已通过添加 Key
和 .AddIdentityServerJwt()
Key 必须添加到 appsettings.Development.json
,如下所示:
"IdentityServer": {
"Key": {
"Type": "Development"
}
}
同时修改 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
};
});
我使用的是 .NET Core API 从 3.1 版开始的授权,在我将我的项目升级到 .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
};
});
配置
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
这是我的 DbContext
public class ApplicationDbContext : ApiAuthorizationDbContext
DbContext 构造函数
public ApplicationDbContext(DbContextOptions options, IOptions operationalStoreOptions, ICurrentUserService currentUserService, IDateTime dateTime) : base(options, operationalStoreOptions)
{
_currentUserService = currentUserService;
_dateTime = dateTime;
}
我收到 NullReferenceException
错误详细信息:
Object reference not set to an instance of an object.
Microsoft.Extensions.DependencyInjection.ConfigureApiResources.GetApiResources()+MoveNext()
Microsoft.Extensions.DependencyInjection.ConfigureApiResources.Configure(ApiAuthorizationOptions options)
编辑: 在 GitHub https://github.com/dotnet/aspnetcore/issues/28456
上提出的问题你的 AddDefaultIdentity 应该是这样的
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
并删除
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
它应该可以工作
如果有人正在寻找此问题的解决方案,根据更新中提供的 Github link,问题已通过添加 Key
和 .AddIdentityServerJwt()
Key 必须添加到 appsettings.Development.json
,如下所示:
"IdentityServer": {
"Key": {
"Type": "Development"
}
}
同时修改 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
};
});