2017-10-01 3 views
1

J'ai deux applications .Net Core, une API Web et un client. Envoi postal du client à l'aide:.net Core 2.0 web api 400 erreur utilisant Validateantiforgerytoken

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

contrôleur client:

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); 
} 

Méthode pour communiquer avec l'API Web:

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); 
    } 
} 

API Web 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); 
} 

Si je supprime [ValidateAntiForgeryToken], ça marche. J'ai également essayé d'enlever [Form], encore j'obtiens l'erreur 400.

Est-ce que je n'ai pas de paramètres supplémentaires dans les configurations de démarrage?

Répondre

0

jetons anti-contrefaçon sont utilisés pour assurer que le formulaire est votre client soumet le formulaire que vous ont délivré --- qui est, il est pas faux.

Dans votre cas, votre application client génère son propre jeton anti-falsification via le @Html.AntiForgeryToken(). Mais ensuite, il n'est pas transmis au HttpClient que vous créez pour parler à votre API Web. Mais même si vous réussissez à transmettre ce jeton anti-falsification à votre API Web, il sera probablement rejeté car il n'a pas été émis par l'API Web.

Vous devez modifier votre API Web pour permettre à votre client d'obtenir un jeton. Voici un blog de Scott Allen sur la façon dont vous pouvez le faire:

+0

Il est logique, j'ai vérifié le blog, ne pouvait pas vraiment suivre la partie sur Axios. Je vais essayer de trouver un exemple étape par étape. Merci de m'avoir indiqué la bonne direction. – hncl

0

Dans le fichier Startup.cs à l'intérieur ConfigureServices() méthode ajouter ci-dessous un service

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

Merci, je ne l'ajoute; malheureusement n'a pas fonctionné – hncl