我对ASP.NET安全模型感到满意,根据它们所处的角色,可以允许/拒绝访问web.config中的用户。
<system.web>
<authorization>
<allow roles = "Admin" />
</authorization>
</system.web>
然而,我想要做的是给管理员用户一组权限,然后可以检查这些权限,例如具有“可以打印文档”,“可以删除文档”等权限的管理员用户
这种事情可以开箱即用,还是我需要沿着自定义路线走下去?
答案 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类