ASP.NET Core 8 OpenID Connect - User.Identity 上缺少 SUB 声明

Nen*_*nad 4 c# asp.net asp.net-core-mvc asp.net-core

我将 ASP.NET MVC Core 7.0 网站升级到 ASP.NET MVC Core 8.0。该站点使用 OpenID Connect 身份提供商进行登录。

更新后,我的sub索赔在集合中丢失了ClaimsPrincipal.Identity.Claims。我会得到:

System.NullReferenceException:“未将对象引用设置为对象的实例。”

当试图获得sub索赔时:

string userId = User.Identity.FindFirst("sub").Value;
Run Code Online (Sandbox Code Playgroud)

经过进一步检查,我注意到该sub声明实际上被重新映射到另一个不同的声明:

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier

尽管在启动配置中删除了默认的 JWT 令牌映射(以前在 ASP.NET Core 7.0 及更早版本中有效),但还是会发生这种情况:

System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Nen*_*nad 15

与早期版本相比,.NET 8.0 有各种重大更改,此处列出了.NET 8 中的重大更改

特别是,这一重大更改正在影响 NuGet 包Microsoft.AspNetCore.Authentication.OpenIdConnect从.7.0.*8.0.*

其中一项更改(详见此处)安全令牌事件返回 JsonWebToken影响Microsoft.AspNetCore.Authentication.OpenIdConnect.TokenValidatedContext.SecurityToken,这反过来又影响 OpenID Connect 客户端行为。根据 Microsoft 的文章,此次重大更改的原因是性能提高了 30%。

为了解决 ASP.NET Core 8.0+ 中的问题,请执行以下行:

System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
Run Code Online (Sandbox Code Playgroud)

必须改为:

Microsoft.IdentityModel.JsonWebTokens.JsonWebTokenHandler.DefaultInboundClaimTypeMap.Clear();
Run Code Online (Sandbox Code Playgroud)

进行此更改后,OpenID Connect 身份验证声明的映射的行为将与早期 .NET 版本中的行为相同。