我有一个角色系统,管理员可以根据页面菜单创建新角色并授予读取,写入,编辑和删除权限(每个页面菜单都有自己的控制器),然后将该角色分配给用户。
用户也可以拥有多个角色但我已经覆盖了这个角色。我面临的唯一问题是:由于角色分配可以在应用程序内动态完成,因此我无法在控制器操作上使用[Authorize(Roles = Role.Admin)]
属性。
相反,我正在考虑创建[读取],[写入],[编辑]和[删除]属性,我将放在操作上让我知道该操作的用途,然后允许或拒绝用户调用该操作行动。
这是正确的做法吗?我需要在这些自定义属性中拥有什么以及如何允许/拒绝用户调用它们?有没有类似的经历?
假设我有Home和Admin控制器,Role1和Role2具有以下权限:
上述方法会有效吗?如何定义控制器操作的自定义访问权限?
我希望避免在数据库中执行所有操作并简化网站上的管理。
通过这种方式,管理可以在控制器级别上的R / W / E / D标志上完成,而不是Role1可以在所有Home / Index,Home / GetRecords等...动作级别。
答案 0 :(得分:1)
我对我的项目有同样的要求。在我的项目中,我必须允许用户访问某些页面和一些页面来管理员。大多数管理员可以访问所有内容,但我必须阻止用户访问某些页面/操作。我做了下面的事情。
一个。创建一个类来验证用户/管理员。
湾为User创建一个类并从“ActionFilterAttribute”继承该类,并覆盖OnActionExecuting方法。
℃。为Admin创建一个类,并执行与“b”中提到的相同的操作,但对于admin。
d。根据访问权限将Authentication类名称放在类名或方法之上。
参见示例代码(步骤b)。我删除了一些代码,但你可以得到这个想法。
public class AuthenticateUser : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext context)
{
//Do session check.
if (HttpContext.Current.Session["Id"] == null || String.IsNullOrEmpty(HttpContext.Current.Session["Id"].ToString()))
{
HttpContext.Current.Response.StatusCode = HttpStatusCode.Forbidden.GetHashCode();
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult { Data = new { Status = HttpStatusCode.Forbidden, LogonRequired = true, result = "Session Expired" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
else
{
//redirect to login page
UrlHelper oUrl = new UrlHelper(HttpContext.Current.Request.RequestContext);
string s = oUrl.Action("", "UserInfo/");
HttpContext.Current.Response.Redirect(s);
}
}
//If usertype is User then allow it. If user type is admin then return redirect.
//Redirect code if admin
UrlHelper oUrl = new UrlHelper(HttpContext.Current.Request.RequestContext);
string s = oUrl.Action("", "UserInfo/");
HttpContext.Current.Response.Redirect(s);
}
}
答案 1 :(得分:0)
我会以不同的方式定义它,只需为每个用户分配一组角色。
为每个用户定义多个角色,如果有人有权写,你为他设置一个角色,如果他也能读,你可以添加另一个角色 - 读。
现在,当您定义操作时,可以使用此格式<script type="text/javascript">
document.addEventListener("DOMContentLoaded", init, false);
function init()
{
var canvas = document.getElementById("canvas");
canvas.addEventListener("mousedown", getPosition, false);
// how can I get the return values here?
}
function getPosition(event)
{
var x = new Number();
var y = new Number();
var canvas = document.getElementById("canvas");
if (event.x != undefined && event.y != undefined)
{
x = event.x;
y = event.y;
}
else
{
x = event.clientX + document.body.scrollLeft +
document.documentElement.scrollLeft;
y = event.clientY + document.body.scrollTop +
document.documentElement.scrollTop;
}
x -= canvas.offsetLeft;
y -= canvas.offsetTop;
alert("x: " + x + " y: " + y); // here can print the correct position
// if I add the two values here, and return them. How can I receive the values in funciton init()
// var clickPosition={"x":x, "y":y};
// return clickPosition;
}
</script>
。通过所需的访问权限设置每个操作,您就完成了。
答案 2 :(得分:0)
使用声明。每个公共控制器操作都声称您需要定义。
然后让他们的角色由他们可以做的声明/操作列表定义。
这里有一个很好的解释Role-based access control (RBAC) vs. Claims-based access control (CBAC) in ASP.NET MVC