1

我正在尝试使用键入的 httpclient 使用 GetAsync 和 PostAsync 合并一个编辑表单页面。除了我的代码不使用 ValidateAntiForgeryToken 调用 API 操作外,一切正常。大多数在线示例都没有解决 httpclientfactory 使用的 httpcontent,而是使用 httpresponse。我知道我的请求中缺少防伪令牌。如何将其附加到请求标头?如何从视图中检索它?我想尽可能少地使用 Javascript。这是我的 Post 请求服务的片段。编辑:对于它的价值,我的 api 是 dot net core 而客户端是 dot net core mvc。

var response = await _httpclient.PostAsync("api/edit/" + id, httpcontent);
response.EnsureSuccessStatusCode(); ```

4

1 回答 1

0

在 MVC Edit 视图页面中,它会使用一个隐藏文件(名为__RequestVerificationToken)来存储 ValidateAntiForgeryToken,您可以使用 F12 开发者工具来检查它。

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">

修改数据后,您可以使用 JQuery 获取更新后的数据,然后使用 JQuery ajax 调用带有 ValidateAntiForgeryToken 的 API 方法。您可以参考我的回复中的示例代码:

如果我们在 Startup.ConfigureServices 中自定义防伪选项,例如:自定义 RequestVerificationToken 的 Header Name。

services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");  //configure the antiforgery service to look for the X-CSRF-TOKEN header. To prevent the cross-site request forgery.

然后,我们可以使用以下脚本:

        $.ajax({
            type: "POST",
            url: "/Survey/Create",
            beforeSend: function (xhr) {
                xhr.setRequestHeader("XSRF-TOKEN",
                    $('input:hidden[name="__RequestVerificationToken"]').val());
            },
            data: { "CategoryName": $("#CategoryName").val(), "CategoryID": $("#CategoryID").val() },
            success: function (response) {
                alert(response);
            },
            failure: function (response) {
                alert(response.responseText);
            },
            error: function (response) {
                alert(response.responseText);
            }
        });

此外,您还可以参考ASP.NET Core 中的防止跨站点请求伪造 (XSRF/CSRF) 攻击

于 2021-10-28T08:43:57.980 回答