ASP.NET安全角色和权限

时间:2009-05-14 11:54:03

标签: asp.net asp.net-membership

我对ASP.NET安全模型感到满意,根据它们所处的角色,可以允许/拒绝访问web.config中的用户。

<system.web>
  <authorization>
    <allow roles = "Admin" />
  </authorization>
</system.web>

然而,我想要做的是给管理员用户一组权限,然后可以检查这些权限,例如具有“可以打印文档”,“可以删除文档”等权限的管理员用户

这种事情可以开箱即用,还是我需要沿着自定义路线走下去?

5 个答案:

答案 0 :(得分:4)

您可以按this MSDN article

中所述使用Azman

但是我对Azman有很多不喜欢的事情,所以我自己作为RoleProvider的补充(管理角色权限映射的附加表,API和管理工具)。

我的自定义实现非常简单:

  • 角色和权限之间的M-N关系。

  • API“HasPermission”,用于测试给定主体是否具有给定权限。这只是遍历所有角色并检查角色是否具有给定的权限。出于性能原因,使用ASP.NET缓存缓存映射权限角色。

答案 1 :(得分:2)

不是开箱即用的;但是如果你想要更细化,为什么不能像“CanPrint”,“CanDelete”这样的粒度角色而不是像“Admin”那样更广泛的角色?

如果他们想要您在评论中指明的容器类型方案,您可以设置自定义IPrincipal - 在身份验证后,以及每个新请求,您可以查看用户的角色成员资格(“管理员”,“公共”等)。 )然后覆盖IPrincipal上的IsInRole。您可以找到示例here

答案 2 :(得分:1)

我发现this文章提供了一个很好的例子

[Flags]
public enum Permissions
{
View                 = (1 << 0),
Add                  = (1 << 1),
Edit                 = (1 << 2),
Delete               = (1 << 3),
Admin                = (View | Add | Edit | Delete)
}

public ActionResult Authenticate(string username, string password)
{
var user = authenticationService.Authenticate(username, password);
Session["User"] = user;

return RedirectToAction("Somewhere", "Else");  
}

public class PermissionsAttribute : ActionFilterAttribute
{
private readonly Permissions required;

public PermissionsAttribute(Permissions required)
{
    this.required = required;
}

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var user = filterContext.HttpContext.Session.GetUser();
    if (user == null)
    {
        //send them off to the login page
        var url = new UrlHelper(filterContext.RequestContext);
        var loginUrl = url.Content("~/Home/Login");
        filterContext.HttpContext.Response.Redirect(loginUrl, true);   
    }
    else
    {
        if (!user.HasPermissions(required))
        {
            throw new AuthenticationException("You do not have the necessary permission to perform this action");
        }
    }
}
}

[Permissions(Permissions.View)]
public ActionResult Index()
{

// ...

}

答案 3 :(得分:0)

您可以在RoleProvider中返回PERMISSIONS而不是ROLES。

public override string[] GetRolesForUser(string username) {
   return GetGrantedPermissions(userName);
}

然后创建管理页面以向角色添加{grant / denied}权限,当然还将用户添加到角色。

答案 4 :(得分:-2)

是的,这是可能的。创建所需的角色,将用户添加到角色,然后在代码中检查User.IsInRole,执行需要该角色的操作。

查看System.Web.Security中的Roles和MemberShip类