2009-11-05 141 views
2

在调查表单授权/身份验证时,我发现可以通过向FormsAuthenticationTicket添加角色数组来执行基于角色的授权。这样,我可以写基于角色/权限的表单授权/认证?

User.IsInRole(role from database) 

但是有什么办法做到像角色的权限相同的事情:

if (User.IsInRole(role from database)) { 
    if (User.CanRead()) { 
     //--- Let the user read 
    } 
    if (User.CanWrite()) { 
     //--- Let the user write 
    } 
} 

我读了几篇文章和论坛帖子的其中添加权限到阵列而不是角色,导致使用

User.IsInRole(permission from database) 

但是,这不是一回事。希望有人可以在这个问题上提供一些意见,或者链接到一篇文章或更好的代码示例。

+0

为什么还原?不知道这与认证(标签)有什么关系,因为User.CanRead和User.CanWrite都是授权方法。 http://www.duke.edu/~rob/kerberos/authvauth.html – mxmissile 2009-11-17 18:10:41

回答

4

你最好改变你对角色的看法。如果有帮助,使用术语“许可”或“声明”。然后创建您需要的所有角色,并将给定的用户链接到所有必要的角色。

一个用户可以属于多个角色。这样,下面的简单代码就可以正常工作,并且不需要建立自己独特的工作方式。

if(User.IsInRole(someRole) && User.IsInRole(someOtherRole)) 
{ 
    // do something 
} 

你可以做一些C#扩展方法,使这个更具可读性太:

if(User.IsInSomeRoleAndOtherRole()) 
{ 
    // do something 
} 

扩展方法可以看起来像下面。用下面的代码创建一个新类,然后在你的代码中包含类命名空间,并且可以使用上面显示的扩展方法。

using System.Security.Principal; 

namespace MyCompany 
{ 
    public static class MyExtensions 
    { 
    public static bool IsInSomeRoleAndOtherRole(this IPrincipal principal) 
    { 
     if (!principal.IsInRole("someRole")) 
     return false; 

     if (!principal.IsInRole("someOtherRole")) 
     return false; 

     return true; // the user meets the requirements 
    } 
    } 
} 
+0

+1是的,这很酷。 – griegs 2009-11-06 00:44:38

+0

好吧,我会这样做的。你能告诉我如何制作扩展方法吗? – 2009-11-06 06:43:40

+0

非常感谢; o) – 2009-11-08 10:26:43