2

環境: ASP.NET MVC 4、Visual Studio 2012

MVC 4 テンプレートによって作成された AccountController には、URL スプーフィング攻撃を防ぐ RedirectToLocal ルーチンが含まれています。このルーチンを独自の外部ライブラリ (独自のライブラリ 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
            }
        }
}
4

1 に答える 1

2

これを解決する 1 つの方法は、保護された Redirect ルーチンを呼び出そうとするのではなく、新しい ActionResult を作成して返すことだと思います。私よりもこのことをよく知っている誰かからの確認をいただければ幸いです。

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}
                   });
            }
        }
}
于 2013-03-03T20:43:29.880 に答える