在WIF中实施自定义声明的正确方法是什么?

时间:2014-02-24 22:34:34

标签: wif

我正在尝试在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权限的系统实现自定义声明的正确方法吗?我应该采用不同的方式吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

通常,用户的声明会为其身份(用户名,电子邮件,角色等)建模,而不一定是他们拥有的权限。在声明授权管理器中,您可以根据用户的身份和正在访问的资源进行数据库查找,然后生成授权结果。

此外,如果您在Web应用程序中执行此操作,内置的ClaimsPrincipalPermission类型会发生异常,因为它会引发异常,并且您在Web应用程序中真正想要的是401,因此您可能会考虑我们拥有的ResourceActionAuthorizeAttribute在Thinktecture IdentityModel帮助程序库中:https://github.com/thinktecture/Thinktecture.IdentityModel