簡體   English   中英

.net Core 2.0 web api 400 錯誤使用 Validateantiforgerytoken

[英].net Core 2.0 web api 400 error using Validateantiforgerytoken

我有兩個 .Net Core 應用程序,一個 Web API 和一個客戶端。 使用以下命令從客戶端發送 Post:

<form asp-action="Create" method="post">
     @Html.AntiForgeryToken()
     .....
</form>

客戶端控制器:

public async Task<IActionResult> Create([Bind("QuestionId,TheQuestion")] SecurityQuestion securityQuestion)
{
    _session.SetString(SessionsKeys.Directory, "/SecurityQuestions");
    if (ModelState.IsValid)
    {
        var data = await _theService.PostWebApi(securityQuestion);
        if (data.Item3 == "True")
        {
            return RedirectToAction(nameof(Index));
        }
        return View(data.Item1);
    }
    return View(securityQuestion);
}

與 Web API 通信的方法:

public async Task<(object, string, string)> PostWebApi(TObject model)
{
    var dir = _session.GetString(SessionsKeys.Directory);
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(_webApiData.WebApiitems.Url);
        MediaTypeWithQualityHeaderValue contentType = new MediaTypeWithQualityHeaderValue("application/json");
        client.DefaultRequestHeaders.Accept.Add(contentType);
        string stringData = JsonConvert.SerializeObject(model);
        var contentData = new StringContent(stringData, System.Text.Encoding.UTF8, "application/json");
        HttpResponseMessage response = client.PostAsync(dir + "/", contentData).Result;
        var msg = await response.Content.ReadAsStringAsync();
        var theresponse = response.IsSuccessStatusCode.ToString();
        return (model,msg,theresponse);
    }
}

Web API 控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> PostSecurityQuestion([FromRoute] SecurityQuestion securityQuestion)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    _context.SecurityQuestion.Add(securityQuestion);
    await _context.SaveChangesAsync();
    return CreatedAtAction("GetSecurityQuestion", new { id = securityQuestion.QuestionId }, securityQuestion);
}

如果我刪除[ValidateAntiForgeryToken] ,它會起作用。 我也嘗試刪除[Form] ,但仍然出現 400 錯誤。

我是否缺少啟動配置中的任何其他設置?

防偽令牌用於確保您的客戶提交的表單是您發布的表單——也就是說,它不是偽造的。

在您的情況下,您的客戶端應用程序正在通過@Html.AntiForgeryToken()生成自己的防偽令牌。 但是,它不會傳遞給您創建的HttpClient以與您的 Web API 對話。 但是,即使您設法將該防偽令牌傳遞給您的 Web API,它也可能會被拒絕,因為它不是由 Web API 發布的。

您應該更改您的 Web API 以允許您的客戶端獲取令牌。 這是 Scott Allen 的一篇關於如何做到這一點的博客:

ConfigureServices()方法內的Startup.cs文件中添加以下服務

services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM