使用Validateantiforgerytoken .net Core 2.0 web api 400错误

时间:2017-10-01 00:01:51

标签: c# asp.net-web-api asp.net-core antiforgerytoken

我有两个.Net Core应用程序,一个Web API和客户端。使用以下方式从客户端发送帖子:

<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 Controller:

[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错误。

我是否在启动配置中缺少任何其他设置?

2 个答案:

答案 0 :(得分:0)

Startup.csConfigureServices()方法文件中添加以下服务

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

答案 1 :(得分:0)

防伪代币用于确保您的客户提交的表格是您发出的表格 - 也就是说,它不是伪造的。

在您的情况下,您的客户端应用通过@Html.AntiForgeryToken()生成自己的防伪令牌。但是,它不会传递给您创建的HttpClient与Web API通信。但即使您设法将该防伪令牌传递给您的Web API,它也可能会被拒绝,因为它不是由Web API发布的。

您应该更改Web API以允许您的客户端获取令牌。以下是Scott Allen关于如何做到这一点的博客: