Я разрабатываю веб-сайт в MVC4. Я разработал роли пользователей и разрешения.
Я хочу спросить, где я должен проверить доступ к разрешениям пользователя: в фильтре пользовательского действия или в фильтре пользовательской авторизации?
Если у пользователя нет доступа к модулю, я должен показать сообщение об ошибке тостера. Как показать это сообщение в фильтре действий?
Я использую для написания атрибута фильтра пользовательских действий, так что при вызове действия этот метод вызывается, и я проверяю его, если роль пользователя позволяет ему вызывать это действие или нет.
Вы должны написать собственный атрибут фильтра действий таким же образом, но вам нужно написать свою собственную бизнес-логику в методе CheckAccessRight:
public class AuthorizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string actionName = filterContext.ActionDescriptor.ActionName;
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
if (!CheckAccessRight(actionName, controllerName))
{
string redirectUrl = string.Format("?returnUrl={0}", filterContext.HttpContext.Request.Url.PathAndQuery);
filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + redirectUrl, true);
}
else
{
base.OnActionExecuting(filterContext);
}
}
private bool CheckAccessRight(string Action, string Controller)
{
if (HttpContext.Current.Session["userId"] != null)
{
string userID = HttpContext.Current.Session["userId"].ToString();
using (var db = new cloud_clinicEntities())
{
assignment objAss = null;
if (HttpContext.Current.Session["AccountType"].ToString() == "lab")
{
objAss = db.assignments.SingleOrDefault(model => model.userid == userID);
}
else
{
objAss = db.assignments.SingleOrDefault(model => model.employeeId == userID);
}
String UserRole = objAss.itemname;
itemchildren objChild = db.itemchildrens.SingleOrDefault(model => model.parent == UserRole && model.child == Controller + " " + Action);
if (objChild != null)
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
}
}
И затем используйте этот атрибут для следующих действий:
[AuthorizationAttribute]
public ActionResult MyAction()
{
}
Вот хорошая статья. Вы можете установить свои собственные атрибуты для нескольких ролей, таких как admin.