как использовать два AntiForgeryToken на одной странице без использования устаревшего свойства ‘Salt’

#asp.net-mvc #antiforgerytoken

#asp.net-mvc #antiforgerytoken

Вопрос:

Как использовать много @Html.AntiForgeryToken() на одной странице?

Когда я устанавливаю, это не работает на удаленном хосте, только локально!

Я пытался использовать разные строки для каждого токена подделки, @Html.AntiForgeryToken("logoff_forgery") но когда я добавляю [ValidateAntiForgeryToken(Salt = "logoff_forgery")] в контроллер, я получаю следующую ошибку

   'System.Web.Mvc.ValidateAntiForgeryTokenAttribute.Salt' 
   'The 'Salt' property is deprecated. 
   To specify custom data to be embedded within the token, 
   use the static AntiForgeryConfig.AdditionalDataProvider property.'   
   D:projectscodesanappCodeSanCodeSanControllersAccountController.cs 
   289  35  CodeSan
  

Кто-нибудь знает, как использовать static AntiForgeryConfig.AdditionalDataProvider ? Если да, пожалуйста, поделитесь этим со мной.

Комментарии:

1. Вы можете включить в представление столько Html.AntiForgeryToken() , сколько захотите. В чем проблема?

2. При этом это не будет работать на удаленном хосте…

Ответ №1:

Как указано в описании Salt , свойство устарело.

Вот простая реализация для IAntiForgeryAdditionalDataProvider

 public class MyAntiForgeryAdditionalDataProvider : IAntiForgeryAdditionalDataProvider
{
    public string GetAdditionalData(HttpContextBase context)
    {
        return GenerateTokenAndSaveItToTheDB();
    }

    public bool ValidateAdditionalData(HttpContextBase context, string additionalData)
    {
        Guid token = Guid.TryParse(additionalData, out token) ? token : Guid.Empty;
        if (token == Guid.Empty) return false;

        return GetIfTokenIsFoundInTheDBAndNotExpired(token);
    }

    private string GenerateTokenAndSaveItToTheDB()
    {
        var newToken = Guid.NewGuid().ToString();
        //save it to the db
        return newToken;
    }
}
  

И вы просто регистрируете его в Global.asax.cs

 protected void Application_Start()
{
    AntiForgeryConfig.AdditionalDataProvider = new MyAntiForgeryAdditionalDataProvider();
}
  

Комментарии:

1. И как мне это использовать? Html.AntiForgeryToken() или Html.MyAntiForgery() ? и вы имеете в виду, что для каждой страницы я буду сохранять токен в базе данных? насколько тяжелым является это решение!

2. На ваш взгляд, вы используете Html.AntiForgeryToken() и всякий раз, когда генерируется вывод, он будет вызывать GetAdditionalData() , чтобы поместить его в токен. Это был просто пример. Вам не обязательно использовать базу данных, это может быть статическое жестко запрограммированное значение guid или что-то из Request . Я просто привел вам пример, чтобы вы начали.