加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-2 – 如何覆盖ActionLink行为

发布时间:2020-12-16 07:15:59 所属栏目:asp.Net 来源:网络整理
导读:好的,我想通过ActionLink方法为我的网站添加一些安全性.如果用户有足够的权限访问操作/控制器,则ActionLink应呈现链接.如果没有,它应该返回一个空字符串.现在,ActionLink是一种静态方法,这使得它变得更加困难.有没有办法实现我想要做的事情? 解决方法 新的A
好的,我想通过ActionLink方法为我的网站添加一些安全性.如果用户有足够的权限访问操作/控制器,则ActionLink应呈现链接.如果没有,它应该返回一个空字符串.现在,ActionLink是一种静态方法,这使得它变得更加困难.有没有办法实现我想要做的事情?

解决方法

新的AuthorizeActionLink扩展方法.根据需要过载.

public static MvcHtmlString AuthorizeActionLink(this HtmlHelper helper,string linkText,string actionName,string controllerName,object routeValues,object htmlAttributes)
{
    if (HasActionPermission(helper,actionName,controllerName))
        return helper.ActionLink(linkText,controllerName,routeValues,htmlAttributes);

    return MvcHtmlString.Empty;
}

public static MvcHtmlString AuthorizeActionLink(this HtmlHelper helper,RouteValueDictionary routeValues,IDictionary<string,object> htmlAttributes)
{
    if (HasActionPermission(helper,htmlAttributes);

    return MvcHtmlString.Empty;
}

在弄清楚用户是否被授权时执行脏工作的方法

static bool HasActionPermission(this HtmlHelper htmlHelper,string controllerName)
{
    ControllerBase controllerToLinkTo = string.IsNullOrEmpty(controllerName)
        ? htmlHelper.ViewContext.Controller
        : GetControllerByName(htmlHelper,controllerName);

    ControllerContext controllerContext = new ControllerContext(htmlHelper.ViewContext.RequestContext,controllerToLinkTo);
    ReflectedControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerToLinkTo.GetType());
    ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext,actionName);

    return ActionIsAuthorized(controllerContext,actionDescriptor);
}

static bool ActionIsAuthorized(ControllerContext controllerContext,ActionDescriptor actionDescriptor)
{
    if (actionDescriptor == null)
        return false;

    AuthorizationContext authContext = new AuthorizationContext(controllerContext,actionDescriptor);
    foreach (IAuthorizationFilter authFilter in actionDescriptor.GetFilters().AuthorizationFilters)
    {
        authFilter.OnAuthorization(authContext);

        if (authContext.Result != null)
            return false;
    }

    return true;
}

static ControllerBase GetControllerByName(HtmlHelper helper,string controllerName)
{
    IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();

    IController controller = factory.CreateController(helper.ViewContext.RequestContext,controllerName);

    if (controller == null)
    {
        throw new InvalidOperationException(
            string.Format(
                CultureInfo.CurrentUICulture,"Controller factory {0} controller {1} returned null",factory.GetType(),controllerName));
    }

    return (ControllerBase)controller;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读