我把我的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();
型
如何解决此问题?
2条答案
按热度按时间dfty9e191#
.NET 8.0与早期版本相比有各种突破性的变化,它们在这里列出Breaking changes in .NET 8。
特别是,这个突破性的变化正在影响NuGet包
Microsoft.AspNetCore.Authentication.OpenIdConnect
从7.0.*
升级到8.0.*
。其中一个变化,这里详细介绍了Security token events return a JsonWebToken影响
Microsoft.AspNetCore.Authentication.OpenIdConnect.TokenValidatedContext.SecurityToken
,这反过来又影响了OpenID Connect客户端的行为。根据微软的文章,突破性变化的原因是性能提高了30%。为了解决ASP.NET Core 8.0+中的问题,请执行以下操作:
字符串
必须改为:
型
在此更改之后,OpenID Connect身份验证声明的Map将与早期.NET版本中的行为相同。
nsc4cvqm2#
System. out. println();
如果您应用此解决方案,它将清除所有策略。您可以具体指定要清除的索赔。示例:
第一个月