#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
. Я просто привел вам пример, чтобы вы начали.