Хорошо, я решил объединить ответ отсюда: jQuery Ajax-вызовы и Html.AntiForgeryToken () с частичным.Я использую нокаут, но для тех из вас, кто не знаком с ним, вы все равно сможете довольно легко следовать за ним.
Сначала мой html:
<form id="__AjaxAntiForgeryForm" action="#" method="post">@{Html.RenderPartial("AntiForgeryToken");}</form>
<div id="loginTestView">
<button data-bind="visible: signedIn() == false,click: signIn">Sign In</button>
<button data-bind="visible: signedIn, click: signOut">Sign Out</button>
<form>
<button data-bind="click: testToken">Test Token</button>
</form>
</div>
Главное отличие в том, что вместо этогоиз @ Html.AntiForgeryToken () У меня есть часть AntiForgeryToken, которая содержит @ Html.AntiForgeryToken ().
Поэтому, чтобы действительно уточнить, у меня теперь есть файл AntiForgeryToken.cshtml, содержащий всего лишь:
@Html.AntiForgeryToken()
Теперь, когда вы входите / выходите, вам нужно обновить токен, чтобы javascript / jquery выглядел так:
$(document).ready(function () {
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
var viewmodel = function () {
var vm = this;
vm.signedIn = ko.observable(false);
vm.signIn = function () {
$.post('Home/SignIn', function () {
vm.signedIn(true);
$.get('Home/GetAuthToken', function (newToken) {
$('#__AjaxAntiForgeryForm').html(newToken);
});
});
};
vm.signOut = function () {
$.post('Home/SignOut', function () {
vm.signedIn(false);
$.get('Home/GetAuthToken', function (newToken) {
$('#__AjaxAntiForgeryForm').html(newToken);
});
});
};
vm.testToken = function () {
$.post('Home/TestToken', AddAntiForgeryToken({ stuff: 'stuff' }));
};
};
ko.applyBindings(new viewmodel(), $('#loginTestView')[0]);
});
Главное, на что следует обратить внимание, это то, что $ .get должен произойти после$ .post для входа / выхода.Этот код можно немного почистить, но это главное.Если вы этого не сделаете, так как запросы асинхронные, $ .get может (и, вероятно, будет) возвращаться до того, как вы действительно войдете в систему.
Это должно сделать это.Я не сталкивался с другими случаями, когда токен обновлялся, но для обновления партиала просто потребовался бы еще один вызов.