基于角色/权限的表单授权/身份验证?

时间:2009-11-05 23:14:23

标签: asp.net asp.net-mvc authentication

在查看表单授权/身份验证时,我发现可以通过向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)

然而,这不是一回事。希望有人可以就此问题提供一些意见,抛出链接到文章或更好的代码示例。

1 个答案:

答案 0 :(得分: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
    }
  }
}