загрузка значения ValidateAntiForgeryToken во время выполнения - PullRequest
2 голосов
/ 08 июня 2010

Рассмотрим приложение ASP.NET MVC, использующее параметр Salt в директиве [ValidateAntiForgeryToken].

Сценарий таков, что приложением будут пользоваться многие клиенты. Не очень желательно, чтобы Salt был известен во время компиляции.

Текущая стратегия заключается в том, чтобы найти значение Salt в web.config.

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

Это приводит к исключению во время компиляции, предполагающему, что Salt должен быть константой во время компиляции.

Аргументом атрибута должно быть константное выражение, выражение typeof или выражение создания массива типа параметра атрибута

Как я могу изменить приложение, чтобы разрешить загрузку Salt во время выполнения, чтобы приложение не было повторно посолено и перекомпилировано для каждого клиента?

Учтите, что Salt не будет часто меняться, если вообще изменится, тем самым устраняя возможность аннулирования формы

Ответы [ 2 ]

6 голосов
/ 21 июля 2010

У меня было требование иметь разные соли для разных клиентов. В этом случае я использовал раствор Диксина для инъекций соли во время выполнения.

Рецепты для защиты от подделки Для 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.
}
6 голосов
/ 08 июня 2010

Свойство Salt должно быть константой времени компиляции. Это просто способ связать определенную форму с определенным методом действия. Например, если у вас есть форма входа в систему, вы можете использовать для этой формы соль «Логин», чтобы токен, действительный для формы входа, не мог использоваться для формы смены пароля и т. Д.

Во всех случаях машинная клавиша приложения автоматически используется как дополнительное солт-значение. Таким образом, токен анти-XSRF для одного приложения нельзя использовать для другого приложения, даже если оба солт-значения читаются как «Логин». Ключ машины настраивается в разделе Web.config .

...