迁移到 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/

中描述的新方法