我们有在Web Farm上托管的MVC 4应用程序。站点在一个域下托管了5个应用程序。这些应用程序相互通信。我们正在为我们的应用程序实施跨站点请求伪造。我们在布局页面上添加了AntiForgeyToken(@ Html.AntiForgeryToken())。 当我们尝试使用Ajax请求跨应用程序发布数据操作时,我们面临以下异常 -
例外:
防伪令牌无法解密。如果此应用程序由Web场或群集托管,请确保所有计算机都运行相同版本的ASP.NET网页,并且配置指定显式加密和验证密钥。 AutoGenerate不能在群集中使用。
对于Ajax请求,我们在prefilter中添加了“__RequestVerificationToken”值,如下所示 -
客户端实施:
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
if (options.type.toLowerCase() == "post") {
if ($('input[name="__RequestVerificationToken"]').length > 0)
jqXHR.setRequestHeader('__RequestVerificationToken',
$('input[name="__RequestVerificationToken"]').val());
}});
在服务器端,我们验证了此令牌,如下所示 -
string cookie = "";
Dictionary<string, object> cookieCollection = new Dictionary<string, object>();
foreach (var key in HttpContext.Current.Request.Cookies.AllKeys)
{
cookieCollection.Add(key, (HttpContext.Current.Request.Cookies[key]));
}
var res= cookieCollection.Where(x => x.Key.Contains("RequestVerificationToken")).First();
cookie = ((System.Web.HttpCookie)(res.Value)).Value;
string formToken = Convert.ToString(HttpContext.Current.Request.Headers["__RequestVerificationToken"]);
if(string.IsNullOrEmpty(formToken))
{
//To validate HTTP Post request
AntiForgery.Validate();
}
else
{
//To validate Ajax request
AntiForgery.Validate(cookie, formToken);
}
我们所做的其他配置如下 -
我们尝试解决此问题的更改
请建议您是否有其他方法可以跨多个应用程序实现针对Ajax POST请求的CSRF功能。