c# - 有效地检查角色声明

标签 c# asp.net asp.net-mvc authentication claims

我正在开发一个 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/

相关文章:

asp.net - 当文件位于不同的服务器上而不先将其下载到我的服务器上时,使用 ASP.Net MVC 在浏览器中强制下载文件

c# - 从 Windows 服务启动浏览器

c# - 前向查找算法

c# - [HttpPost] 和 [WebMethod] 有什么区别?

asp.net - NuGet 不断使 Visual Studio 2013 崩溃

asp.net - 如何在 mvc 2 中将复杂数据作为模型从 View 传递到 Controller

asp.net-mvc - MVC 架构中的项目何时应该拥有自己的 Controller ?

c# - 我想做一个文本框区域,自动剪切一个长段落

c# - 如何在docker中设置dotnet core的环境?

asp.net - 来自 ASP.Net 服务器的推送通知