我正在开发一个 Asp.NET MVC5 Web 应用程序 (.NET 4.6),我需要向具有特定声明的一组用户显示一些额外的 HTML 行。我见过一些冗长的解决方案,但我更喜欢保持简短,所以我想到了这个
@{
if (System.Security.Claims.ClaimsPrincipal.Current.Claims.ToList().FirstOrDefault(c => c.Type == "role" && c.Value == "AwesomeUserRole") != null) {
<!-- my HTML goes here -->
}
}
这是检查经过身份验证的用户声明的好方法还是有最佳实践可供遵循?也欢迎任何更清洁/更高效的解决方案。
最佳答案
因为 ASP.NET 中的所有 Identity
对象现在都是 ClaimsIdentity
,所以您始终可以将当前的 IPrincipal
转换为 ClaimsIdentity
:
((System.Security.Claims.ClaimsIdentity)User.Identity).HasClaim("role", "AwesomeUserRole")
但实际上最简单的方法是使用 User.IsInRole("AwesomeUserRole")
只要您没有更改默认配置,类型为role
的声明就会自动输入到线程主体的角色集合中。
如果您需要检查除角色之外的其他声明类型,我通常会为 IPrincipal
创建一组扩展方法来包装声明检查:
public static bool CanDoX(this IPrincipal principal)
{
return ((ClaimsIdentity)principal.Identity).HasClaim(claimType, claimValue);
}
扩展方法的好处是您可以检查任何类型的声明并返回它们可能包含的任何值,而不仅仅是声明是否存在。
关于c# - 有效地检查角色声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35087307/