。NET Core 3.1,Vue,Axios和[ValidateAntiForgeryToken]

问题描述 投票:1回答:1

我整天都在玩这个游戏,并且尽可能多地阅读,但我完全没能使它正常工作。

我已经将自己的实现与MS文档以及围绕SO的其他答案进行了比较,但似乎没有一种方法可行。

问题的根源是从匿名用户和已登录用户切换。

我一直在遵循MS建议here。以及各种答案herehere

为了进行测试,我有一个联系表,其端点用[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并更新标题:

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) => {

但是那实际上是获取已确定值已更新的值的另一种方法。

我用尽了所有的想法,似乎还需要尝试。因此,这个问题。

我是否错过任何明显的事情?似乎我几乎逐字地复制了MS Angular示例,所以我对自己做错了事感到茫然。

任何指针将不胜感激。

c# vue.js asp.net-core axios antiforgerytoken
1个回答
0
投票

如您对问题的评论中所述。我对它与AppStartup中某些东西的排序有关,记忆犹新。这是我拥有的文件的转储。这目前有效(似乎很好)。

© www.soinside.com 2019 - 2024. All rights reserved.