Я играл с этим весь день и читал столько, сколько мог, и мне совершенно не удалось заставить это работать.
Я сравнил свою реализацию с документацией MS и другими ответами вокруг ТАК и ни один из подходов, похоже, не работает.
Проблема root заключается в переходе от анонимного пользователя и вошедшего в систему пользователя.
Я следую совету MS здесь . И различные ответы здесь и здесь
Для тестирования у меня есть одна контактная форма с конечной точкой, украшенной [ValidateAntiForgeryToken]
.
Поток:
Посетите сайт, опубликуйте эту форму и все отлично работает. Вход в систему Посетите форму, отправьте сообщение - BOOM - Предоставленный токен защиты от подделки был предназначен для пользователя, основанного на утверждениях, отличного от текущего пользователя.
В моем методе public void Configure(
у меня есть:
app.Use(async (context, next) =>
{
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("CSRF-TOKEN", tokens.RequestToken, new CookieOptions { HttpOnly = false });
await next();
});
В моем public void ConfigureServices(
методе у меня есть:
services.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");
В моем Vue Маршрутизаторе я добавил вызов к методу на моем топоре ios API следующим образом:
router.afterEach((to, from) => {
api.readCsrfCookieAndSetHeader();
});
Этот метод просто читает повар ie и обновляет заголовок:
public readCsrfCookieAndSetHeader() {
console.info('READING CSRF-TOKEN');
if (document.cookie.indexOf('CSRF-TOKEN') > -1) {
const v = document.cookie.match('(^|;) ?' + 'CSRF-TOKEN' + '=([^;]*)(;|$)');
const r = v ? v[2] : '';
// console.log(r);
this.csrfToken = r;
axios.defaults.headers.common['X-CSRF-TOKEN'] = this.csrfToken;
console.log(axios.defaults.headers.common['X-CSRF-TOKEN']);
} else {
this.csrfToken = '';
}
}
Я вижу, как это значение изменяется постранично. Одно из предложений, которое, похоже, сработало для некоторых, - это перезапустить GetAndStoreTokens
в том месте, где пользователь выполнил вход, например:
var user = await _userManager.FindByEmailAsync(userName);
var result = await _signInManager.PasswordSignInAsync(user, password, true, false);
_httpContextAccessor.HttpContext.User = await _signInManager.CreateUserPrincipalAsync(user);
if (result.Succeeded)
{
// get, store and send the anti forgery token
AntiforgeryTokenSet tokens = _antiforgery.GetAndStoreTokens(_httpContextAccessor.HttpContext);
_httpContextAccessor.HttpContext.Response.Cookies.Append("CSRF-TOKEN", tokens.RequestToken, new CookieOptions { HttpOnly = false });
}
return result;
Но у меня это тоже не сработало.
Я также пытался обновить значение с помощью перехватчика ax ios, например:
axios.interceptors.response.use(
(response) => {
// this.readCsrfCookieAndSetHeader();
return response;
},
(error) => {
Но на самом деле это просто еще один способ обновить значение, которое, я уверен, уже обновляется.
У меня закончились идеи и, кажется, есть что попробовать. Отсюда этот вопрос.
Я что-то упустил очевидное? Кажется, я почти дословно воспроизвел пример MS Angular, поэтому я не понимаю, что я сделал неправильно.
Любые указатели будут очень признательны.