我正在尝试了解 ASP.NET 身份验证和授权机制。我明白什么是主张和什么是角色。在几乎所有相关的博客文章或此处的问题中,建议使用声明并避免角色。在这一点上我很困惑。如何使用没有角色的声明?(我通常在用户注册后为其分配角色。)
任何帮助表示赞赏。
谢谢
我正在尝试了解 ASP.NET 身份验证和授权机制。我明白什么是主张和什么是角色。在几乎所有相关的博客文章或此处的问题中,建议使用声明并避免角色。在这一点上我很困惑。如何使用没有角色的声明?(我通常在用户注册后为其分配角色。)
任何帮助表示赞赏。
谢谢
角色也是声明,声明只是更笼统。
在几乎所有相关的博客文章或此处的问题中,建议使用声明并避免角色。
我只能推测,因为您没有显示确切的链接,所以它不完全是“对角色的要求”。
它是“使用基于声明的安全模型而不是基于角色的安全模型”。这个很容易解释,因为角色也是声明,使用声明你有角色,但你也可能有其他声明。
从技术上讲,如果您创建ClaimsPrincipal
并添加Role
声明,ASP.NET 将在您期望的任何位置正确识别角色 - WebForms 授权、MVC 授权过滤器和其他基于角色的东西照常工作。
如果您需要一些技术细节,请参阅我的博客文章,其中我展示了如何轻松地从旧的基于角色的表单身份验证切换到新的基于声明的身份验证。
http://www.wiktorzychla.com/2014/11/forms-authentication-revisited-for-net.html
特别是,您只需添加这样的角色声明
var identity = new ClaimsIdentity( "custom" );
identity.AddClaim( new Claim( ClaimTypes.Name, txtLogin.Text ) );
identity.AddClaim( new Claim( ClaimTypes.Role, "admin" ) );
var principal = new ClaimsPrincipal( identity );
// write the principal to cookie
但是,声明为您提供的是基于任意声明(例如“用户超过 18 岁”或“用户来自法国、德国或西班牙”)进行授权的能力。这种武断的陈述不一定映射到“角色”,而是完美的主张。
您可以使用自定义声明授权管理器进行此授权,此处的示例
声明和角色都可以单独使用。一方面,角色根据他们所属的组来控制访问,而声明根据用户对自己的各种陈述来控制访问
以下两个链接提供了基于角色和声明的安全性的概述,以及有关如何在属性中使用声明的示例,该属性随后可以附加到控制器操作并提供类似于以下内容的授权AuthorizeAttribute
: