2014-02-08 2 views
1

Я написал собственный атрибут фильтра для проверки на каждое действие контроллера, если пользователь имеет право доступа к этому действию, я предоставляю доступ, иначе я перенаправляю на контроллер Несанкционированный доступ, вот мой код:Общий способ скрыть ActionLinks, проверив право доступа

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); 
     } 
    } 
} 

Вот мой CheckAccessRight Метод:

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 = db.assignments.SingleOrDefault(model => model.userid == 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; 
    } 
} 

теперь я хочу на моем каждого вида, если есть ссылка действия на действия контроллера, который пользователь не имеет права доступа к нему не должно быть вынесено на странице или он должен быть скрыт. Как это сделать в общем виде, у меня есть идея, которую я могу сделать, добавив инструкцию if для каждой Action Link, но я не думаю, что ее лучший подход.

+0

возможно дубликат [Role-контента на основе asp.net MVC] (http://stackoverflow.com/questions/928654/role-based-content-asp-net-mvc) –

ответ

0

Создайте HTML-помощник, который является расширением до нормального ActionLink, но он принимает еще один аргумент, который является строкой роли, как показано ниже. Credit goes to Eu-ge-ne for his original solution

public static class Html 
{ 
    public static string RoleActionLink(this HtmlHelper html, string role, string linkText, string actionName, string controllerName) 
    { 
     return html.ViewContext.HttpContext.User.IsInRole(role) 
      ? html.ActionLink(linkText, actionName, controllerName) 
      : String.Empty; 
    } 
} 
+0

но как насчет если У меня есть некоторые якорные теги: Link как я справляюсь с этим также? –

+0

@EhsanSajjad Сколько ссылок привязки у вас на вашей странице, если вы специально говорите о меню, тогда вы можете иметь меню обрезки безопасности в MVC. Но если вы говорите о случайных ссылках на целых страницах, то я боюсь, что вам нужно либо пойти с пользовательскими настройками Helper или If. Если это требование состоит в том, чтобы показать/скрыть некоторые ссылки на табличные данные, я просто перейду с помощью Html Helper, потому что его легко поддерживать. – ramiramilu

+0

вы можете поделиться некоторым примером кода на том, что мне нужно скрыть некоторые случайные ссылки на моей странице, я написал специальный фильтр действий, и пользователь может просматривать страницу, но требование - скрыть его, если оно не в его правах. –

Смежные вопросы