Я работаю над приложением angular 2
с использованием бэкэнда ASP.Net MVC
. Для этого index.cshtml
включил @Html.AntiForgeryToken();
, поэтому я возвращаю скрытый элемент ввода с токеном в качестве его значения. В моем интерфейсе я могу захватить этот токен и использовать его для моих запросов. Все идет нормально.Альтернативный способ для использования токена CSRF вместо использования @ Html.AntiForgeryToken() в ASP.Net MVC
Теперь, когда информация пользователя используется для генерации токена в бэкэнд, я должен отключить токен в некоторых случаях. Описана проблема here in this question.
Теперь, поскольку я не хочу делать полную перезагрузку страницы в своем приложении, я должен использовать обходной путь. Для этого я создал частичный вид в интерфейсе, который просто протягивает этот вход, используя @Html.AntiForgeryToken();
в ActionResult
с простым методом, как это:
public ActionResult GetAntiForgery()
{
return PartialView("~/Views/Home/AntiForgery.cshtml");
}
После Логин/выход из системы я вызвать эту функцию из моего интерфейса и заменить значение мои существующих AntiForgery input element
вроде этого:
getAntiForgery(url:string) {
return this._http.get(url)
.map((response:any) => {
let originalXsrfElement = <HTMLInputElement>document.querySelector('[name=__RequestVerificationToken]');
let body = response._body;
if(body) {
let helperElem = document.createElement('div');
helperElem.innerHTML = body;
let helperInputElem = <HTMLInputElement>helperElem.firstChild;
originalXsrfElement.value = helperInputElem.value;
}
return response;
});
}
Я даже не могу сказать вам, что ошибки меня больше всего. Мне не нравится делать дополнительный запрос (но не позволяет погрузиться в это здесь), но для меня более страшным является то, что я должен что-то запросить, вернуть строку html и извлечь из нее строку токенов.
Если бы я был бэкэндом, я бы убил парня-фронтмена (меня ..) за то, что он даже думал о создании дополнительного частичного представления, создавая дополнительный метод и всегда делая два запроса на вход/выход из системы вместо одного.
Есть ли лучший способ? Например, я хотел бы назвать метод, который просто выдает JSON
с правильным токеном вместо HTML snippet
. Еще лучше, по существующим методам JsonResult
в бэкэнд, я хотел бы добавить новый CSRF Token
как собственность.
Я не архитектор, так что может быть что-то неправильно в общем, как я это делаю, но мои коллеги-бэкэнд не возражают против того, что я там делаю, поэтому это не должно быть так далеко.
Любые советы приветствуются.
Похоже, этот вопрос может помочь (в основном ставит против подлога в заголовке АЯКС вместо скрытого поля): HTTP: // StackOverflow.com/questions/15416264/validateantiforgerytoken-with-spa-architecture – JohnnyFun
Извините, не могу понять, как это помогает с моей проблемой. Вопрос другой. – lexith
Раздел «Анти-CSRF и AJAX» в связанной статье кажется, что это может быть то, что вы ищете: http://www.asp.net/web-api/overview/security/preventing-cross-site- запрос-подлог-csrf-attack – JohnnyFun