我正在尝试在ASP.NET MVC应用程序中实现基于声明的安全性。我计划使用ClaimsPrincipalPermission类来验证基于资源/操作对的访问。
例如
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Read", Resource="Invoices")]
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Create", Resource="Fees")]
所以现在我需要自定义声明来验证我的操作/资源对。我有不同的资源,所有资源都有CRUD操作。
以下是我对自定义声明的想法:
((ClaimsIdentity)incomingPrincipal.Identity).AddClaim(new Claim("http://mysoftware.com/identity/claims/invoices", "Read"));
或
((ClaimsIdentity)incomingPrincipal.Identity).AddClaim(new Claim("http://mysoftware.com/identity/claims/fees", "Create"));
((ClaimsIdentity)incomingPrincipal.Identity).AddClaim(new Claim("http://mysoftware.com/identity/claims/fees", "Read"));
基本上,每个资源有一种声明类型,声明值可以是读取/创建/更新/删除的组合。这是为使用CRUD权限的系统实现自定义声明的正确方法吗?我应该采用不同的方式吗?
谢谢!
答案 0 :(得分:0)
通常,用户的声明会为其身份(用户名,电子邮件,角色等)建模,而不一定是他们拥有的权限。在声明授权管理器中,您可以根据用户的身份和正在访问的资源进行数据库查找,然后生成授权结果。
此外,如果您在Web应用程序中执行此操作,内置的ClaimsPrincipalPermission类型会发生异常,因为它会引发异常,并且您在Web应用程序中真正想要的是401,因此您可能会考虑我们拥有的ResourceActionAuthorizeAttribute在Thinktecture IdentityModel帮助程序库中:https://github.com/thinktecture/Thinktecture.IdentityModel