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 版本中的行为相同。
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |