【发布时间】:2016-01-18 18:23:57
【问题描述】:
我最近在 MVC/angularjs 上实现了 XSRF。安全网站的加载方式有两种,一种是直接发布,另一种是 iframe。
下面是代码:- 角度
.config(function ($httpProvider) {
$httpProvider.defaults.xsrfCookieName = '@model.Handlers.XsrfHandler.COOKIE_HEADER_NAME';
$httpProvider.defaults.xsrfHeaderName = '@model.Handlers.XsrfHandler.COOKIE_HEADER_NAME';
})
MVC - 过滤器
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var response = filterContext.HttpContext.Response;
//TODO : Check the current value of the cookie if it exists
if (request.HttpMethod != "GET")
{
base.OnResultExecuting(filterContext);
return;
}
//TODO : SHA hash the cookie or something.
var cookieValue = filterContext.HttpContext.Session.SessionID;
if (!request.Cookies.AllKeys.Contains(AntiForgeryConfig.CookieName))
{
var cookie = new HttpCookie(XsrfHandler.COOKIE_HEADER_NAME, cookieValue) { HttpOnly = false };
response.SetCookie(cookie);
}
else
{
response.Cookies[XsrfHandler.COOKIE_HEADER_NAME].Value = cookieValue;
}
base.OnResultExecuting(filterContext);
}
MVC 处理程序
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!xsrfMethods.Contains(request.Method.Method))
return await base.SendAsync(request, cancellationToken);
var cookie = request.Headers.GetCookies().SelectMany(chv => chv.Cookies).FirstOrDefault(cs => cs.Name == COOKIE_HEADER_NAME);
if (cookie == null)
return CreateError(request);
var headerValue = request.Headers.GetValues(COOKIE_HEADER_NAME).FirstOrDefault();
if (string.IsNullOrWhiteSpace(cookie.Value) || string.IsNullOrWhiteSpace(headerValue))
return CreateError(request);
if (headerValue.Trim().Equals(cookie.Value.Trim(), System.StringComparison.InvariantCulture))
return await base.SendAsync(request, cancellationToken);
return CreateError(request);
}
现在我们有一个客户端正在 HTTP 站点上加载 HTTPS iframe(不知道为什么)。它在 chrome、firefox 中仍然可以正常工作,但在 IE 中失败。 XSRF 令牌似乎没有附加到 IE 的 POST 请求标头。
我的问题是,标题问题的解决方法是什么,而无需添加任何边缘案例逻辑。
【问题讨论】:
标签: angularjs asp.net-mvc internet-explorer iframe csrf