通过检查访问权限来隐藏ActionLinks的通用方法

时间:2014-02-08 05:33:14

标签: c# asp.net-mvc asp.net-mvc-4

我已经编写了一个自定义过滤器属性来检查每个控制器操作,如果用户有权访问该操作我给予访问权限,否则我重定向到控制器未授权访问,这是我的代码:

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

现在我希望在我的每个视图中是否有操作链接到控制器操作,用户无权访问它不应该在页面上呈现或应该隐藏它。如何以通用的方式做到这一点,我知道我可以通过在每个Action Link上添加if语句来做,但我认为它不是更好的方法。

1 个答案:

答案 0 :(得分:0)

创建一个HTML Helper,它是普通ActionLink的一种扩展,但它还需要一个参数,即Role string,如下所示。 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;
    }
}