2

ディレクティブでSaltパラメーターを使用する ASP.NET MVC アプリケーションを考えてみましょう。[ValidateAntiForgeryToken]

シナリオは、アプリが多くの顧客によって使用されるようなものです。Saltコンパイル時に既知であることはあまり望ましくありません。

現在の戦略は、web.config でソルト値を見つけることです。

[ValidateAntiForgeryToken(Salt = Config.AppSalt)]
//Config.AppSalt is a static property that reads the web.config.

Saltこれにより、コンパイル時に const でなければならないことを示すコンパイル時の例外が発生します。

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式でなければなりません

Salt顧客ごとにアプリを再ソルトして再コンパイルする必要がないように、アプリケーションを変更して実行時にロードできるようにするにはどうすればよいですか?

Saltが頻繁に変更されることはないと考えてください。これにより、フォームが無効になる可能性がなくなります

4

2 に答える 2

6

Salt プロパティは、コンパイル時の定数であることを意図しています。これは単に、特定のフォームを特定のアクション メソッドにリンクする方法です。たとえば、ログイン フォームがある場合、このフォームにソルト「Login」を使用して、ログイン フォームで有効だったトークンをパスワード変更フォームなどに使用できないようにすることができます。

いずれの場合も、アプリのマシン キーが追加のソルト値として自動的に使用されます。そのため、両方のソルト値が「ログイン」を読み取っていても、あるアプリケーションのアンチ XSRF トークンを別のアプリケーションに使用することはできません。マシン キーは、Web.config の<machineKey>セクションで設定できます。

于 2010-06-08T08:31:08.927 に答える
6

顧客ごとに異なる塩を用意する必要がありました。この場合、実行時にソルトを注入するために Dixin のソリューションを使用しました。

ASP.NET MVC および AJAX のアンチ フォージェリ リクエスト レシピの「実行時に非定数ソルトを指定する」というタイトルのセクション。

コントローラーを新しい属性で装飾します。

[ValidateAntiForgeryTokenWrapper(HttpVerbs.Post)]
public class ProductController : Controller
{     
    // Only HTTP POST requests are validated.
}

この新しい属性は次のように定義されます。

public class ValidateAntiForgeryTokenWrapperAttribute : FilterAttribute, IAuthorizationFilter
{
    public ValidateAntiForgeryTokenWrapperAttribute(HttpVerbs verbs)
    {
        this._verbs = new AcceptVerbsAttribute(verbs);
        this._validator = new ValidateAntiForgeryTokenAttribute()
            {
                //load from web.config or anywhere else
                Salt = Configurations.AntiForgeryTokenSalt
            };
    }

    // Other members.
}
于 2010-07-21T15:32:50.650 に答える