迁移到 NET6
Migration To NET6
我试图将我的 ASP 核心项目迁移到 NET6
我的项目使用下一个包
IdentityServer4.AccessTokenValidation - 3.0.1
IdentityModel.AspNetCore.OAuth2Introspection - 4.0.1
IdentityModel - 5.2.0
项目构建成功。
但是当我 运行 申请时,我得到错误
MissingMethodException: Method not found: 'IdentityModel.Client.DiscoveryEndpoint IdentityModel.Client.DiscoveryEndpoint.ParseUrl(System.String)'.
IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationOptions.ConfigureJwtBearer(JwtBearerOptions jwtOptions)
IdentityServer4.AccessTokenValidation.ConfigureInternalOptions.Configure(string name, JwtBearerOptions options)
Microsoft.Extensions.Options.OptionsFactory<TOptions>.Create(string name)
Microsoft.Extensions.Options.OptionsMonitor<TOptions>+<>c__DisplayClass10_0.<Get>b__0()
有人遇到过这个问题吗?
我调查了这个问题并找到了原因。
我在更新前使用了 IdentityModel V 4,2,2。
当我将我的项目更新到 NET 6 时,IdentityModel 已升级到版本 5.2.0。
IdentityModel V 4,2,2 和 IdentityModel 5.2.0 版本的区别在于签名方法。
public static DiscoveryEndpoint ParseUrl(string input, string path = null) version 5,2,0
public static DiscoveryEndpoint ParseUrl(string input) version 4,2,2
所以我们看到在新版本中添加了默认参数。
但是这个方法是由 IdentityServer4.AccessTokenValidation 包中的方法调用的。并且此包未编译为调用更新的 ParseUrl 函数。
关于这个问题请看这个话题
Roman 的回答是正确的,我们可以通过 IdentityModel 降级 修复它 ,但解决该问题的另一种方法是替换 IdentityServer4.AccessTokenValidation by Microsoft.AspNetCore.Authentication.JwtBearer 我们可以使用 IdentityServer4.AccessTokenValidation 稍微更改令牌验证像这样进行验证:
services
.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(
options =>
{
options.Authority = configuration["Authentication:Authority"];
options.ApiName = configuration["Authentication:ApiName"];
});
现在我们可以像这样使用 Microsoft.AspNetCore.Authentication.JwtBearer 进行令牌验证:
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = configuration["Authentication:Authority"];
options.RequireHttpsMetadata = false;
options.TokenValidationParameters.ValidAudiences = new List<string>() { configuration["Authentication:ApiName"] };
});
IdentityServer4.AccessTokenValidation 库已弃用,因此没有针对 IdentityModel 版本 5.2.0 编译的版本。
您应该使用 https://leastprivilege.com/2020/07/06/flexible-access-token-validation-in-asp-net-core/
中描述的新方法
我试图将我的 ASP 核心项目迁移到 NET6 我的项目使用下一个包
IdentityServer4.AccessTokenValidation - 3.0.1
IdentityModel.AspNetCore.OAuth2Introspection - 4.0.1
IdentityModel - 5.2.0
项目构建成功。 但是当我 运行 申请时,我得到错误
MissingMethodException: Method not found: 'IdentityModel.Client.DiscoveryEndpoint IdentityModel.Client.DiscoveryEndpoint.ParseUrl(System.String)'.
IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationOptions.ConfigureJwtBearer(JwtBearerOptions jwtOptions)
IdentityServer4.AccessTokenValidation.ConfigureInternalOptions.Configure(string name, JwtBearerOptions options)
Microsoft.Extensions.Options.OptionsFactory<TOptions>.Create(string name)
Microsoft.Extensions.Options.OptionsMonitor<TOptions>+<>c__DisplayClass10_0.<Get>b__0()
有人遇到过这个问题吗?
我调查了这个问题并找到了原因。 我在更新前使用了 IdentityModel V 4,2,2。 当我将我的项目更新到 NET 6 时,IdentityModel 已升级到版本 5.2.0。 IdentityModel V 4,2,2 和 IdentityModel 5.2.0 版本的区别在于签名方法。
public static DiscoveryEndpoint ParseUrl(string input, string path = null) version 5,2,0
public static DiscoveryEndpoint ParseUrl(string input) version 4,2,2
所以我们看到在新版本中添加了默认参数。 但是这个方法是由 IdentityServer4.AccessTokenValidation 包中的方法调用的。并且此包未编译为调用更新的 ParseUrl 函数。
关于这个问题请看这个话题
Roman 的回答是正确的,我们可以通过 IdentityModel 降级 修复它 ,但解决该问题的另一种方法是替换 IdentityServer4.AccessTokenValidation by Microsoft.AspNetCore.Authentication.JwtBearer 我们可以使用 IdentityServer4.AccessTokenValidation 稍微更改令牌验证像这样进行验证:
services
.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(
options =>
{
options.Authority = configuration["Authentication:Authority"];
options.ApiName = configuration["Authentication:ApiName"];
});
现在我们可以像这样使用 Microsoft.AspNetCore.Authentication.JwtBearer 进行令牌验证:
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = configuration["Authentication:Authority"];
options.RequireHttpsMetadata = false;
options.TokenValidationParameters.ValidAudiences = new List<string>() { configuration["Authentication:ApiName"] };
});
IdentityServer4.AccessTokenValidation 库已弃用,因此没有针对 IdentityModel 版本 5.2.0 编译的版本。
您应该使用 https://leastprivilege.com/2020/07/06/flexible-access-token-validation-in-asp-net-core/
中描述的新方法