我已经编写了一个自定义过滤器属性来检查每个控制器操作,如果用户有权访问该操作我给予访问权限,否则我重定向到控制器未授权访问,这是我的代码:
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语句来做,但我认为它不是更好的方法。
答案 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;
}
}