【发布时间】:2020-08-18 05:50:44
【问题描述】:
我整天都在玩这个,尽可能多地阅读,但我完全没能做到这一点。
我已将我的实现与 MS 文档和其他围绕 SO 的答案进行了比较,但似乎没有一种方法有效。
问题的根源在于匿名用户和登录用户的切换。
我一直遵循 MS 的建议 here。以及各种答案here和here
为了进行测试,我有一个联系表格,其端点用[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 路由器中,我添加了对我的 axios API 上的方法的调用,如下所示:
router.afterEach((to, from) => {
api.readCsrfCookieAndSetHeader();
});
这个方法只是读取cookie并更新header:
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;
但这对我也不起作用。
我也尝试使用 axios 拦截器更新值,如下所示:
axios.interceptors.response.use(
(response) => {
// this.readCsrfCookieAndSetHeader();
return response;
},
(error) => {
但这实际上只是另一种获取更新值的方法,我确信它已经被更新了。
我的想法已经用完了,而且似乎还有一些可以尝试的东西。所以这个Q。
我错过了什么明显的东西吗?似乎我几乎逐字复制了 MS Angular 示例,所以我不知道自己做错了什么。
任何指针将不胜感激。
【问题讨论】:
-
哦主啊,你刚刚给我这个帖子可怕的闪回。我的 Core & Angular 应用程序遇到了完全相同的问题。我有这样的假记忆,这与
app.Use语句的顺序有关。我将在答案中发布我的 Startup.cs,它可能会有所帮助... -
你,先生。很可能即将获得一颗金星...... :)
标签: c# vue.js asp.net-core axios antiforgerytoken