0

Asp.net MVCは、多くの(そして非常に便利な)HtmlHelper拡張機能を提供します。しかし、既存のものを拡張するいくつかの拡張メソッドを備えたマイクロサブフレームワークを提供する場合はどうなりますか?

つまりBeginForm、よりリッチになるように書き直すことができます(偽造防止トークンなどのセキュリティ機能を常に追加します)。

質問

Asp.net MVCのHTMLヘルパーメソッドのすべてを書き直さないために、どうすれば私の使用を強制できますか?そのため、通常を使用BeginFormすると、例外がスローされるか、そもそもアクセスできなくなります。2番目の選択は、ビューのフォルダーweb.configファイルSystem.Web.Mvc.Htmlから名前空間を削除しないと不可能な可能性があります。これは、これらのヘルパーすべてを書き直す必要があることを意味します。そして、それは私がやりたくないことです。

重要なのは、このマイクロサブフレームワークを使用すると、セキュリティ上の理由から標準ヘルパーの使用を防ぐ必要があるということです。限目。

他にどのようなオプションがありますか?

私が自分BeginFormで書くだけで、それを次のBeginSecureFormように使用するとします。

@using Html.BeginSecureForm() {
    ...
    @Html.EditorFor(m => m.Something)
    ...
}

ご覧のとおり、カスタムヘルパーと標準EditorForヘルパーも使用しました。これは、System.Web.Mvc.Htmlのような非カスタムヘルパーを使用するためにまだ含まれていることを意味しEditorForます。

私のカスタムヘルパーメソッドを使用している限り、上位のコードは正常に機能します...しかし、一部の開発者がそうすることを忘れて、代わりに通常のメソッドを使用した場合はどうなりますか?

@using Html.BeginForm() {
    ...
    @Html.EditorFor(m => m.Something)
    ...
}

この場合、私は次のいずれかを行います。

  • Html.BeginFormまったくアクセスできない
  • Html.BeginFormセキュアバージョンを使用する必要があるという例外をスローします
  • 私が知らない他のことは、標準の使用を防ぐために行うことができますBeginForm
4

2 に答える 2

1

これを実現する 1 つの可能性は、カスタムを記述し、カスタムのプロパティでプロパティをWebViewPageオーバーライドすることです。Html

public abstract class MyWebViewPage<T> : WebViewPage<T>
{
    public override void InitHelpers()
    {
        this.Ajax = new AjaxHelper<T>(ViewContext, this);
        this.Html = new MyHtmlHelper<T>(ViewContext, this);
        this.Url = new UrlHelper(ViewContext.RequestContext);
    }

    public new MyHtmlHelper<T> Html { get; set; }
}

MyHtmlHelper<T>開発者が直接使用したくないメソッドを廃止するカスタムクラスを次に示します。

public class MyHtmlHelper<T>: HtmlHelper<T>
{
    public MyHtmlHelper(ViewContext viewContext, IViewDataContainer viewDataContainer)
        : base(viewContext, viewDataContainer)
    {
    }

    [Obsolete("Use SecureBeginForm instead", true)]
    public MvcForm BeginForm()
    {
        throw new Exception("Use SecureBeginForm instead.");
    }
}

よし、あとは、アプリケーション内のすべての Razor ビューのベース タイプを切り替えるだけです。これは~/Views/web.config、置換する場所の中で行うことができます:

<pages pageBaseType="System.Web.Mvc.WebViewPage">

と:

<pages pageBaseType="MyAppName.Mvc.MyWebViewPage">

これで、マイクロ フレームワーク拡張メソッドをMyHtmlHelperクラスに記述して、既定のメソッドに対応するカスタムのセキュアなメソッドを提供できるようになりました。

public static class MyHtmlHelperExtensions
{
    public static MvcForm SecureBeginForm<T>(this MyHtmlHelper<T> html)
    {
        var rawUrl = html.ViewContext.HttpContext.Request.Url.AbsoluteUri;
        var builder = new UriBuilder(rawUrl);
        builder.Scheme = Uri.UriSchemeHttps;
        var form = new TagBuilder("form");
        form.Attributes["action"] = builder.ToString();
        form.Attributes["method"] = "post";

        html.ViewContext.Writer.Write(form.ToString());
        return new MvcForm(html.ViewContext);
    }
}

そして今、任意の Razor ビュー内で:

@using (Html.SecureBeginForm())
{
    ...
}

そして、あなたが試みたとき:

@using (Html.BeginForm())
{
    ...
}

コンパイル時にエラーが発生します (Razor ビューのコンパイルを有効にしていると仮定します)。

ここに画像の説明を入力

そうでない場合は実行時例外。

于 2012-06-14T09:44:52.263 に答える