ASP.NET MVC AntiForgeryToken механизм основан на текущем HttpContext.User
. Он использует это значение для создания токена, когда вы вызовите Html.AntiForgeryToken ()
. В основном это нормально (см. объяснение в последнем абзаце здесь ), но проблема возникает, когда вы входите в систему через вызов Ajax .
В моем коде, когда пользователь входит в систему, учетные данные отправляются как объект Json в Ajax (значение скрытого поля AntiForgeryToken
также отправляется внутри Json), сервер аутентифицирует пользователя. , применяет FormsAuthentication.SetAuthCookie () и возвращает результат Json, который содержит некоторые пользовательские данные.Таким образом, я могу избежать полного обновления страницы при входе в систему.
Проблема в том, что каждый последующий запрос Ajax к серверу теперь завершается ошибкой ValidateAntiForgeryTokenAttribute
, потому что теперь ожидается токен защиты от подделки, несовместимый с файлом cookie защиты от подделки.
Как я могу получить действующий токен защиты от подделки, который нужно вставить в скрытое поле клиента, чтобы каждый запрос Json после входа в систему выполнялся успешно?
Я попытался получить новый токен скрытого поля вручную (с помощью AntiForgery. GetHtml ()
в действии, извлекая саму строку токена, возвращая ее клиенту в Json и помещая ее в скрытое поле защиты от подделки вручную в JavaScript), но это не работает - последующий вызов Ajax завершается ошибкой ValidateAntiForgeryTokenAttribute
на сервере.
Фактически, каждый вызов AntiForgery.GetHtml ()
(который, по сути, является помощником Html.AntiForgeryToken ()
действительно) создает другой токен, который делает недействительным предыдущий.
Я также пытался установить HttpContext.User = new GenericPrincipal (new GenericIdentity (email), null);
, как подробно описано здесь , но это не сработало.
Примечание: Это решение не работает для меня из-за моей конкретной ситуации: логин Ajax , который изменяет личность пользователя на сервере и, следовательно, каждый токен, который был сгенерирован до того, как логин недействителен; это решение также неприменимо, поскольку оно решает другую проблему.