如何通过Identity中的Claim获取邮箱,调用GetClaimsByType返回null如何解决
问题原因
你调用失败的核心原因是查询时使用了简化字符串作为Claim类型参数,但当前Identity存储的邮箱Claim对应的类型是标准WS-Identity协议定义的完整URI格式,二者不匹配导致查询返回空结果。
正确实现方案
有两种常用的正确写法,推荐优先使用第二种避免拼写错误:
// 方案1:直接传入完整的Claim类型URI查询 var emailClaim = User.Claims.FirstOrDefault(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"); string email = emailClaim?.Value;
// 方案2:使用.NET内置的预定义常量查询(需引入System.Security.Claims命名空间) using System.Security.Claims; string email = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value;
如果要继续使用你之前的GetClaimsByType方法,调整写法即可:
using System.Security.Claims; var email = User.Identity.GetClaimsByType(ClaimTypes.Email).FirstOrDefault()?.Value;
之前写法的错误点
- 传入的Claim类型参数不匹配,不是简化的
email/emailaddress字符串,需要用完整URI或者系统预定义常量 - 直接对
GetClaimsByType的返回值调用ToString():该方法返回的是Claim集合对象,直接调用ToString只会返回集合的类型名称,永远拿不到实际的邮箱值,需要先取到集合内的单个Claim对象,再访问它的Value属性才能拿到存储的邮箱内容
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

