在子域应用程序的 ASP.NET Core 中通过 jQuery Ajax 验证防伪令牌失败

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

我正在开发一个项目,需要在 ASP.NET Core 中通过 jQuery Ajax 发送帖子。

$.ajax({
            url: _url,
            headers: {
                [tokenheadername]: token
            },
            type: 'POST',
            data: _data,
            success: function (r) { location.reload(); },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                swal('Error', 'Cannot update entry!' + XMLHttpRequest.status, 'error');
            },

        });

控制器操作具有 [ValidateAntiForgeryToken] 属性,

    [HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize(Roles = "Admin,Manager,User")]
    public async Task<IActionResult> UpdateEntry(Guid id,string filepath,string originalfilename, bool isvideo)
    {
       ...
        return Ok();
    }

以下是启动文件中的防伪设置:

services.AddAntiforgery(options =>
        {
            options.HeaderName = "__RequestVerificationToken"; 
            options.Cookie.Name = Configuration["domain"];
        });

它在我的本地开发调试环境中运行得很好。然而它在产品上失败了。产品应用程序位于 submain 中。 错误代码是 400。

非常感谢您的帮助。

ajax asp.net-core subdomain antiforgerytoken
1个回答
0
投票

我知道这是一篇较旧的帖子,但也许尝试更改您的 Ajax 调用以使用

beforeSend: function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input[name=__RequestVerificationToken]').val()); }
。 如果 __RequestVerificationToken 为空,您可能还需要将
@Html.AntiForgeryToken()
添加到您的视图中。

如果是.NET6 之前的版本,请更新您的startup.cs 文件以具有

services.AddAntiforgery(options => { options.HeaderName = "XSRF-TOKEN"; });
。 如果是 .NET 6 或更高版本,请将此代码添加到 program.cs 文件中。

注意:如果仍然出现错误,可能在开发时使用Visual Studio中的“IIS Express”。 在 Kestrel 下执行应用程序时,我们发现了细微的差异。 IIS Express 可能会向您显示在代码的产品发布版本中遇到的错误。

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