环境:ASP.NET MVC 4,Visual Studio 2012
MVC 4模板创建的AccountController包含一个RedirectToLocal例程,可防止URL欺骗攻击。我想将此例程移动到我自己的外部库(在其自己的库DLL项目中)。经过一些调查,看起来最好的方法是扩展Controller类。我的(不成功)尝试这样做如下所示。
我的问题是Controller.Redirect和Controller.RedirectToAction都是受保护的内部功能,并且“由于其保护级别而无法访问”。
从外部库调用Redirect或RedirectToAction的常用方法是什么?
public static class ControllerExtensionMethods
{
public static ActionResult RedirectToLocal(
this Controller controller,
string redirectUrl)
{
if (controller.Url.IsLocalUrl(redirectUrl)) {
return controller.Redirect(redirectUrl); // error
} else {
return controller.RedirectToAction("Index", "Home"); // error
}
}
}
答案 0 :(得分:2)
我想解决这个问题的一种方法是制作并返回一个新的ActionResult而不是尝试调用受保护的Redirect例程。我非常感谢能够比我更了解这些东西的人的确认。
public static class ControllerExtensionMethods
{
public static ActionResult RedirectToLocal(
this Controller controller,
string redirectUrl)
{
if (controller.Url.IsLocalUrl(redirectUrl)) {
return new RedirectResult(redirectUrl);
} else {
return new RedirectToRouteResult(
new RouteValueDictionary {
{"controller", controllerName},
{"action", actionName}
});
}
}
}