używam JQuery z ASP.NET Rdzenia 1.0.1 i mam połączenie Ajax:Włącz zabezpieczającym token z ASP.NET Core i JQuery
$("#send-message").on("submit", function (event) {
event.preventDefault();
var $form = $(this);
$.ajax({
url: "api/messages",
data: JSON.stringify($form.serializeToJSON()),
dataType: "json",
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
type: "post"
})
.done(function (data, status, xhr) { })
.fail(function (xhr, status, error) { });
działaniu ASP.NET Rdzeń:
[HttpPost("messages")]
public async Task<IActionResult> Post([FromBody]MessagePostApiModelModel model) {
// Send message
}
formularz jest w udostępnionym widzenia i jest on następujący:
<form id="send-question" method="post">
<textarea name="content"></textarea>
<button class="button" type="submit">Enviar</button>
</form>
Kiedy przesłać formularz pojawia się błąd:
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The required antiforgery header value "RequestVerificationToken" is not present.
Jak mogę włączyć AntiForgeryToken programu ASP.NET Core za pomocą wywołań JQuery Ajax?
UPDATE
muszę dodać następujący Asp-Asp-kontrolera i działania do postaci:
<form asp-controller="QuestionApi" asp-action="Post" id="send-question" method="post">
</form>
To wygeneruje token zabezpieczającym. I musiałem ręcznie dodać token nagłówkach wywołania JQuery następująco:
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"RequestVerificationToken": $form.find("input[name='af_token']").val()
},
Czy istnieje lepszy sposób to zrobić?
Jak rozwiązać ten problem, gdy nie ma formularza i mam tylko znacznik A, który po kliknięciu wywołuje połączenie Ajax? Czy mogę wygenerować wspólny token antiforgery na mojej stronie głowy, który będzie używany przez wszystkie wywołania ajax z tej strony?
Czy formularz wygenerował stronę serwera przy użyciu helpera formularza? Jeśli tak jest, token zostanie automatycznie wygenerowany dla ciebie jako pole [ukryte dane wejściowe] (http://stackoverflow.com/questions/30959972/html-antiforgerytoken-still-required), więc będzie uwzględniony w form.serializeToJSON'. Bez względu na odpowiedź potrzebny jest również atrybut '[ValidateAntiForgeryToken]' w akcji kontrolera. –
@ DanielJ.G. Czy jest on generowany po stronie serwera, ale nie używam asp-controller i asp-action, ponieważ przesyłam go za pomocą JQuery. Właśnie aktualizuję moje pytanie. Czy czegoś brakuje? –
Potrzebowałem dodać ręcznie następujący nagłówek w moim wywołaniu JQuery: headers: {"RequestVerificationToken": $ form.find ("input [nazwa = 'af_token]". Val() }, ... Czy jest lepszy droga? –