CSRF for Ajax请求跨一个域中的应用程序

时间:2015-08-26 09:31:16

标签: ajax asp.net-mvc csrf-protection

我们有在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);
}

我们所做的其他配置如下 -

  1. 我们在配置中有机器密钥,对所有应用程序以及所有Web服务器都是相同的。
  2. 我们在跨应用程序访问令牌的所有应用程序中设置了AntiForgeryConfig.CookieName =“__ RequestVerificationToken”+“_ XYZ”cookie名称。
  3. 我们尝试解决此问题的更改

    1. 我们尝试在每个ajax请求的数据中发布“__RequestVerificationToken”,以便我们可以使用Request.Form访问它,但是没有成功。
    2. 我们已经验证每个请求都会显示Content-Type标头。
    3. 请建议您是否有其他方法可以跨多个应用程序实现针对Ajax POST请求的CSRF功能。

0 个答案:

没有答案