我正在尝试了解ASP.NET身份验证和授权机制。我理解什么是索赔&什么是角色。在几乎所有相关的博文中,或者在这里提出问题时,建议使用声明并避免角色。我在这一点上很困惑。如何使用没有角色的声明? (我通常在用户注册后为其分配角色。)
感谢任何帮助。
谢谢
答案 0 :(得分:4)
角色也是主张,声称更为一般。
在几乎所有相关的博客文章或问题中,建议使用声明并避免角色。
我只能推测,因为你没有显示确切的链接,但它并不完全是#34;对角色的声明"。
相反,"使用基于声明的安全模型而不是基于角色的安全模型"。这个很容易解释,因为角色也是声明,使用你有角色的声明,但你也可能有其他声明。
从技术上讲,如果您创建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岁"或者"用户来自法国,德国或西班牙"。这种任意陈述不一定映射到"角色"但是完美的主张。
您使用自定义声明授权管理器执行此授权,此处为示例
答案 1 :(得分:1)
声明和角色可以分别使用。角色一方面根据它们属于哪个组来控制访问权限,而声明根据用户对自己做出的各种陈述来控制访问权限
以下两个链接提供了基于角色和声明的安全性的概述,以及如何在属性中使用声明的示例,该声明随后可以附加到控制器操作并提供类似于AuthorizeAttribute
的授权: