当我使用" ValidateAntiForgeryToken"时,获得400个错误请求和"授权"

时间:2017-05-28 22:21:22

标签: xamarin asp.net-core-mvc jwt dotnet-httpclient antiforgerytoken

我在服务器端使用asp.net核心,在客户端使用xamarin。我使用JWT令牌,我想同时验证伪造令牌。

这是我的客户端代码:

 public async Task<string> PostAsync(object model, string url)
        {
            var cookieContainer = new CookieContainer();
            var handlerhttps = new HttpClientHandler
            {
                UseCookies = true,
                UseDefaultCredentials = true,
                CookieContainer = cookieContainer
            };

            var clientPage = new HttpClient(handler: handlerhttps)
            {
                BaseAddress = new Uri(uriString: Application.Current.Resources[index: "Domain"] + "/api/token")
            };

            var pageWithToken = await clientPage.GetAsync(requestUri: clientPage.BaseAddress);
            var verificationToken = await pageWithToken.Content.ReadAsStringAsync();
            using (var handler = new HttpClientHandler
            {
                CookieContainer = cookieContainer,
                UseDefaultCredentials = true,
                UseCookies = true
            })
            {
                using (var client = new HttpClient(handler: handler) {BaseAddress = new Uri(uriString: url)})
                {
                    client.DefaultRequestHeaders.Add(name: "RequestVerificationToken", value: verificationToken);
                    if (Application.Current.Properties[key: "Token"] != null)
                    {
                        var token = Application.Current.Properties[key: "Token"].ToString();
                        client.DefaultRequestHeaders.Authorization =
                            new AuthenticationHeaderValue(scheme: "Bearer", parameter: token);
                    }


                    var json = JsonConvert.SerializeObject(value: model);
                    var content = new StringContent(content: json, encoding: Encoding.UTF8,
                        mediaType: "application/json");
                    var response = await client.PostAsync(requestUri: client.BaseAddress, content: content);
                    var result = await response.Content.ReadAsStringAsync();
                    return result;
                }
            }
        } 

我的问题是,当我同时在服务器端使用[ValidateAntiForgeryToken][Authorize]时,我收到400个错误请求。

但是当我删除[ValidateAntiForgeryToken]时,它会毫无问题地进行授权。

当我删除[Authorize]时,我没有收到400个错误请求,并且成功验证了伪造令牌。

我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

如果您使用Microsoft.AspNetCore.Mvc.TagHelpers,则会添加一个难以猜测的输入字段&#39;代码:

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8PXv-VNSuRBLvOlUgHlQcf4p8B29vW6EKn4ENesSgHR79kWTvbnQ9a1Taj90b-e66-79H7Nx5ljHnvPbwqfSNqHMRMaBkoRKGsTxtbZZlq0rSl2zbGK2aKpPQc0qnoNuRehSNhP097P5-Vlp-3OSPYdIqLQJSqIsPDaQsEOXsNU4qIIDrj-tIhqk5EW9tTYc6g">

无论如何,即使您添加@Html.AntiForgeryToken(),也不会发生冲突。但是你不能装饰“第一个”。使用[ValidateAntiForgeryToken]的控制器操作,只有最后一个将获得POST。

示例:

行动1

[HttpPost]
[AllowAnonymous]
[ActionName("SpecialSignUp")]
public IActionResult Index([FromForm] string email)
{
    // TODO : code in here
    return View(email);
}

用户将通过POST重定向到上述操作。

让我们说上面的视图显示一个预填充电子邮件字段的表单以及其他要填写的字段。

如果您使用[ValidateAntiForgeryToken]进行装饰,则会收到 400(错误请求)。删除它,一切都会好的。

行动2

[HttpPost]
[AllowAnonymous] // It could be [Authorized]
[ActionName("SpecialSignUp")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> LaunchSignUpAsync([FromForm] SpecialSignUpViewModel model)
{
    // TODO : Code in here
    return RedirectToAction("OtherActionX", data);
}

表单将通过上述视图

发布

现在它全部正常工作,不再发生冲突了。如果您尊重该序列,它将适合您!

我有同样的问题,而且它发生了,因为我装饰了行动1&#39;还有[ValidateAntiForgeryToken]

希望它有所帮助!

答案 1 :(得分:0)

我遇到了类似的问题,但通过添加&#34; RequestVerificationToken&#34;解决了这个问题。根据我的要求

我的控制器代码(样本)

HttpPost(&#34; SignOut&#34) 授权==&gt;使用JWT     ValidateAntiForgeryToken * /