Asp.net mvc 2 如何覆盖ActionLink行为

Asp.net mvc 2 如何覆盖ActionLink行为,asp.net-mvc-2,overriding,actionlink,Asp.net Mvc 2,Overriding,Actionlink,好的,我想通过ActionLink方法为我的站点增加一些安全性。如果用户有足够的权限访问操作/控制器,则ActionLink应呈现该链接。如果不是,它应该返回一个空字符串。现在,ActionLink是一种静态方法,这使得它更加困难。有什么方法可以实现我想要做的吗?新的AuthorizeActionLink扩展方法。根据需要过载 public static MvcHtmlString authorizedActionLink(此HtmlHelper帮助程序、字符串链接文本、字符串操作名、字符串控制

好的,我想通过ActionLink方法为我的站点增加一些安全性。如果用户有足够的权限访问操作/控制器,则ActionLink应呈现该链接。如果不是,它应该返回一个空字符串。现在,ActionLink是一种静态方法,这使得它更加困难。有什么方法可以实现我想要做的吗?

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

public static MvcHtmlString authorizedActionLink(此HtmlHelper帮助程序、字符串链接文本、字符串操作名、字符串控制器名、对象路由值、对象htmlAttributes)
{
if(HasActionPermission(助手、操作名、控制器名))
返回helper.ActionLink(linkText、actionName、controllerName、routeValue、htmlAttributes);
返回MvcHtmlString.Empty;
}
public static MvcHtmlString AuthorizeActionLink(此HtmlHelper帮助程序、字符串链接文本、字符串操作名、字符串控制器名、RouteValueDictionary routeValues、IDictionary HtmlatAttribute)
{
if(HasActionPermission(助手、操作名、控制器名))
返回helper.ActionLink(linkText、actionName、controllerName、routeValue、htmlAttributes);
返回MvcHtmlString.Empty;
}
方法,这些方法在确定用户是否被授权时做了大量的工作

static bool HasActionPermission(此HtmlHelper、字符串actionName、字符串controllerName)
{
ControllerBase controllerToLinkTo=string.IsNullOrEmpty(controllerName)
?htmlHelper.ViewContext.Controller
:GetControllerByName(htmlHelper,controllerName);
ControllerContext ControllerContext=新的ControllerContext(htmlHelper.ViewContext.RequestContext,controllerToLinkTo);
ReflectedControllerDescriptor controllerDescriptor=新的ReflectedControllerDescriptor(controllerToLinkTo.GetType());
ActionDescriptor ActionDescriptor=controllerDescriptor.FindAction(controllerContext,actionName);
返回ActionIsAuthorized(controllerContext、actionDescriptor);
}
静态bool ActionIsAuthorized(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor)
{
if(actionDescriptor==null)
返回false;
AuthorizationContext authContext=新的AuthorizationContext(controllerContext,actionDescriptor);
foreach(actionDescriptor.GetFilters().AuthorizationFilters中的IAAuthorizationFilter authFilter)
{
authFilter.OnAuthorization(authContext);
if(authContext.Result!=null)
返回false;
}
返回true;
}
静态ControllerBase GetControllerByName(HtmlHelper助手,字符串controllerName)
{
IControllerFactory=ControllerBuilder.Current.GetControllerFactory();
IController controller=factory.CreateController(helper.ViewContext.RequestContext,controllerName);
如果(控制器==null)
{
抛出新的InvalidOperationException(
字符串格式(
CultureInfo.CurrentUICulture,
“控制器工厂{0}控制器{1}返回空值”,
factory.GetType(),
控制器名称);
}
返回(ControllerBase)控制器;
}

这不是很好的安全性。如果用户能够知道链接是什么,他们可以直接输入。隐藏链接可能是一件额外的事情,但是你真正的安全应该发生在服务器上。是的,我做到了,当它全部连接起来的时候,这是非常棒的。我会找出一些代码…@Matt,如果做得好就不是真的。在呈现链接之前,您可以从类/方法创建查询
Authorize
属性的ActionLink。因此,您只需使用Authorize属性即可控制链接的可见性和对该方法的访问。因此,无法使用相同的Html.ActionLink()方法进行此操作?否,但我认为这是一种很好的可重用方法,可以在整个系统中显示这种类型的条件链接application@hunter如果我们在页面上列出了15个用户的用户上有编辑链接,那么整个代码将执行15次。只是计算控制器中的haspermission值并将其推送到视图上通过一些viewmodel@Muhammad对于任何给定的操作/控制器组合,没有理由不能通过在
HttpContext.Items
中添加
HasActionPermission
的结果来扩展。“这实际上是个好主意。”亨特,你能给我一个起点吗,我是说如何接近它