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

oalqel3c  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(136)

我把我的ASP.NETMVCCore7.0网站升级到ASP.NETMVCCore8.0。这个网站使用OpenIDConnect身份提供者登录。
更新后,我的sub声明在ClaimsPrincipal.Identity.Claims集合中丢失。我会得到:
System.NullReferenceException:“对象引用未设置为对象的示例。”
当尝试获取sub声明时:

string userId = User.Identity.FindFirst("sub").Value;

字符串
经过进一步检查,我注意到sub声明实际上被重新Map到了另一个声明:
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
尽管在启动配置中删除了默认的JWT标记Map(以前在ASP.NET Core 7.0和更早版本中有效),但仍会发生这种情况:

System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();


如何解决此问题?

dfty9e19

dfty9e191#

.NET 8.0与早期版本相比有各种突破性的变化,它们在这里列出Breaking changes in .NET 8
特别是,这个突破性的变化正在影响NuGet包Microsoft.AspNetCore.Authentication.OpenIdConnect7.0.*升级到8.0.*
其中一个变化,这里详细介绍了Security token events return a JsonWebToken影响Microsoft.AspNetCore.Authentication.OpenIdConnect.TokenValidatedContext.SecurityToken,这反过来又影响了OpenID Connect客户端的行为。根据微软的文章,突破性变化的原因是性能提高了30%。
为了解决ASP.NET Core 8.0+中的问题,请执行以下操作:

System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

字符串
必须改为:

Microsoft.IdentityModel.JsonWebTokens.JsonWebTokenHandler.DefaultInboundClaimTypeMap.Clear();


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

nsc4cvqm

nsc4cvqm2#

System. out. println();
如果您应用此解决方案,它将清除所有策略。您可以具体指定要清除的索赔。示例:
第一个月

相关问题