没有角色的要求?
Claims without roles是一个问题,它出现的原因是Claims和Roles可以分别使用。Roles根据用户所属的组来控制访问权限,而Claims根据用户自己关于自己的各种声明来控制访问权限。
解决这个问题的方法是使用Claims来实现类似于AuthorizeAttribute的授权。下面的两个链接提供了关于基于角色和声明的安全性的概述,并提供了如何在属性中使用Claims的示例,然后将其附加到控制器操作中,实现授权。
- [What is the claims in ASP .NET Identity](https://stackoverflow.com/questions/21645323)
- [ASP.NET Claims Authorization with ASP.NET Identity](http://bitoftech.net/2015/03/31/asp-net-web-api-claims-authorization-with-asp-net-identity-2-1/)
在几乎每篇相关的博客文章或问题中,都建议使用声明(claims)而避免使用角色(roles)。
我只能推测,因为你没有给出具体的链接,所以并不是完全指“声明(claims)优于角色(roles)”。实际上是“使用基于声明(claims)的安全模型而不是基于角色(roles)的安全模型”。这个很容易解释,因为角色也是声明,使用声明你不仅有角色,还可能有其他声明。
从技术上讲,如果你创建一个ClaimsPrincipal并添加Role声明,ASP.NET将会正确地识别角色,无论你在哪里期望它工作 - WebForms授权,MVC授权过滤器以及其他基于角色的功能都可以正常工作。
如果你需要一些技术细节,请参考我的博客文章,我在那里展示了如何轻松从旧的基于角色的Forms身份验证切换到新的基于声明的身份验证。
具体来说,你只需要像这样添加角色声明:
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); // 将principal写入cookie
然而,声明给你的是基于“任意”声明进行授权的能力,例如“用户年龄大于18岁”或“用户来自法国、德国或西班牙”。这些任意的声明不一定与“角色”相对应,但是它们是完美的声明。
你可以通过自定义的声明授权管理器进行此授权,这里有一些示例:
https://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager(v=vs.110).aspx