在自定义Claims示例中添加空ClaimsIdentity的作用是什么?
为什么要始终添加ClaimsIdentity?
首先明确:你的写法完全可以正常工作,但微软官方示例的写法主要是出于代码简洁性、一致性和扩展性的考量,而且添加空的ClaimsIdentity不会对程序造成任何负面影响。
具体原因如下:
1. 代码结构更简洁一致
官方示例的写法避免了在if分支内重复编写AddIdentity逻辑。如果后续需要添加多个不同的Claim判断,你只需要在同一个ClaimsIdentity实例上添加Claim即可,不用在每个条件分支里都写一遍创建Identity并添加的代码,结构更清晰,减少重复代码。
比如后续要新增另一个Claim时,官方写法的扩展性优势会体现出来:
ClaimsIdentity claimsIdentity = new ClaimsIdentity(); var claimType1 = "myNewClaim"; if (!principal.HasClaim(claim => claim.Type == claimType1)) { claimsIdentity.AddClaim(new Claim(claimType1, "myClaimValue")); } var claimType2 = "anotherClaim"; if (!principal.HasClaim(claim => claim.Type == claimType2)) { claimsIdentity.AddClaim(new Claim(claimType2, "anotherValue")); } principal.AddIdentity(claimsIdentity); return Task.FromResult(principal);
这种写法只需要一次AddIdentity调用,逻辑更集中;而你的写法则需要在每个if块内重复创建Identity并添加,代码冗余度更高。
2. 空Identity不会产生副作用
ASP.NET Core的ClaimsPrincipal会自动忽略不包含任何Claim的ClaimsIdentity,添加空Identity不会对身份验证、授权逻辑造成任何影响,也不会带来可感知的性能损耗——创建一个空的Identity实例的成本几乎可以忽略不计。
3. 扩展性更好
如果未来需要给这个Identity添加额外属性(比如指定AuthenticationType),或者新增其他Claim规则,官方示例的写法只需要在现有代码基础上扩展,不需要调整核心代码结构。而你的写法则需要修改每个条件分支内的代码,调整成本更高。
总结来说,两种写法功能等价,但官方示例的写法在可维护性和扩展性上更优,同时不会引入任何负面问题,所以采用了“始终添加”的方式。
内容的提问来源于stack exchange,提问作者Brecht Yperman
相关产品推荐
相关产品推荐

