【发布时间】:2019-01-31 23:34:46
【问题描述】:
和标题说的差不多。这是javascript ...在不验证令牌时可以正常工作。验证时似乎看不到它,因为我收到 The required anti-forgery form field "__RequestVerificationToken" is not present. 错误。
var downloadEmailSignature = function (control) {
if (control) {
let form = $(control).closest('form');
let token = $(form).find('input[name="__RequestVerificationToken"]').val();
if (form) {
let request = new XMLHttpRequest();
request.open("POST", "Forms/DownloadEmailSignature");
request.responseType = "blob";
request.setRequestHeader('RequestVerificationToken', token);
request.data = form.serialize();
request.onload = function () {
if (window.clientData.browser.name === "Internet Explorer") {
window.navigator.msSaveBlob(this.response, "EmailSignature.hta");
}
else{
let url = window.URL.createObjectURL(this.response);
let a = document.createElement("a");
document.body.appendChild(a);
a.href = url;
a.download = this.response.name || "download-" + $.now();
a.click();
}
};
console.dir(request);
request.send();
}
}
};
以及背后的代码...
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DownloadEmailSignature(string emailSignature)
{
var hta = (MediaItem)SitecoreContext.GetItem<Item>(new Guid("{EE806F14-5BD3-491C-9169-DA701357FB45}"));
using (var reader = new StreamReader(MediaManager.GetMedia(hta).GetStream().Stream))
{
var htaText = reader.ReadToEnd();
htaText = htaText.Replace("*CARDSTRING*", emailSignature);
var stream = new MemoryStream(htaText.ToASCIIByteArray());
return new FileStreamResult(stream, "application/hta");
}
}
最后是视图...
<form id="download-email-signature" method="POST" enctype="multipart/form-data">
@Html.HiddenFor(m => m.EmailSignatureMarkup)
@Html.AntiForgeryToken()
@Html.FormIdentifier("FormsController", "DownloadEmailSignature")
<a href="#" id="download-installer" onclick="downloadEmailSignature(this); return false;" class="btn-primary" style="margin-bottom:10px;margin-top:-10px;text-align:center;">Download installer</a>
</form>
【问题讨论】:
-
这:在不验证令牌时工作正常。 似乎表明令牌不存在或无效。您设置了自定义 HTTP 标头,但不显示它是如何使用的,甚至不显示它是如何使用的。您采取了哪些措施来确保它在两端都存在并且有效?标头是否包含令牌?
-
@RandyCasburn 它存在于标记中,我已将
token记录到它显示的控制台。应该在问题中明确说明 -
和标题?
-
@RandyCasburn 该标头存在于请求标头列表中。那不是问题。
[ValidateAntiForgeryToken]注释服务器端应该查找此标头。不管什么原因,它都看不到它。它是 asp.net mvc 的开箱即用功能 -
您的
downloadEmailSignature函数适用于手工编码的 HTML。请提供显示在浏览器中的已解析 HTML 输出。附带说明一下,在token=赋值语句中,$()周围不需要form,因为它已经是一个 jQuery 对象。
标签: javascript ajax asp.net-mvc xmlhttprequest antiforgerytoken