进在开发公司的文件中心组件,提供各个子系统的附件上传下载、预览、版本更新等功能,前端在今天突然给我发一张图,说预览缩略图遇到问题了,然后发了个截图给我:

这很明显是一个跨域问题,

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, <iframe>或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。

X-Frame-Options 有三个值:

DENY

  表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

SAMEORIGIN

  表示该页面可以在相同域名页面的 frame 中展示(一般默认是这种)。

ALLOW-FROM uri

  表示该页面可以在指定来源的 frame 中展示。

此处很明显需要在中间件里面修改一下响应头的X-Frame-Options属性,core的中间件流程如下:

所以我们需要实现一个响应头的增删集合类:

    /// <summary>
/// 响应头的增删集合
/// </summary>
public class SecurityHeadersPolicy
{
public IDictionary<string, string> SetHeaders { get; }
= new Dictionary<string, string>(); public ISet<string> RemoveHeaders { get; }
= new HashSet<string>();
}

然后实现一个增删响应头的中间件:

/// <summary>
/// 中间件实现
/// </summary>
public class SecurityHeadersMiddleware
{
private readonly RequestDelegate _next;
private readonly SecurityHeadersPolicy _policy; public SecurityHeadersMiddleware(RequestDelegate next, SecurityHeadersPolicy policy)
{
_next = next;
_policy = policy;
} public async Task Invoke(HttpContext context)
{
IHeaderDictionary headers = context.Response.Headers; foreach (var headerValuePair in _policy.SetHeaders)
{
headers[headerValuePair.Key] = headerValuePair.Value;
} foreach (var header in _policy.RemoveHeaders)
{
headers.Remove(header);
} await _next(context);
}
}

提供响应头的增删方法:

    /// <summary>
/// 响应头的增删方法
/// </summary>
public class SecurityHeadersBuilder
{
private readonly SecurityHeadersPolicy _policy = new SecurityHeadersPolicy();
public SecurityHeadersBuilder AddCustomHeader(string header, string value)
{
_policy.SetHeaders[header] = value;
return this;
}
public SecurityHeadersBuilder RemoveHeader(string header)
{
_policy.RemoveHeaders.Add(header);
return this;
}
public SecurityHeadersPolicy Build()
{
return _policy;
}
}

然后我们需要一个中间件的拓展方法:

    /// <summary>
/// 中间件拓展方法
/// </summary>
public static class UseSecurityHeaders
{
public static IApplicationBuilder UseSecurityHeadersMiddleware(this IApplicationBuilder app, SecurityHeadersBuilder builder)
{
SecurityHeadersPolicy policy = builder.Build();
return app.UseMiddleware<SecurityHeadersMiddleware>(policy);
}
}

然后就是在startup的Configure方法中注册我们的中间件:

            //允许iframe嵌入资源
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
.AddCustomHeader("X-Frame-Options", "AllowAll")
);

我在这里使用的值是“AllowAll” 而不是“ALLOW-FROM uri” 是为了方便测试,如果开发的话应该是需要进行配置的,到这里再嵌入网页即可成功。

最新文章

  1. sql行列旋转
  2. phoenix 开发API系列(二)phoenix 各类 api 实现方式
  3. 前端mvc框架backbone.js入门
  4. window.event对象详尽解析
  5. Objective-C之Category的使用
  6. Java基础-jdk动态代理与cglib动态代理区别
  7. JavaScript 拼接JSON
  8. 关于spring 3.0.5的 &lt;mvc:resources mapping=&quot;***&quot; location=&quot;***&quot;&gt;标签的使用
  9. form表单无刷新提交文件(iframe)
  10. chrome下的js调试
  11. Javascript里,想把一个整数转换成字符串,字符串长度为2
  12. Cocos2d-x 3.0 红孩儿私家必修 - 第二章 cpp-empty-test
  13. 同步关键字synchronized
  14. [TYVJ] P1015 公路乘车
  15. js实现页面图片加载进度条
  16. 简析ASP.NET WebApi的跨域签名
  17. (转)Sublime Text2 快捷键汇总
  18. 【python】BIF及查看函数帮助
  19. 一键安装Lnmp教程
  20. Spring注解与Java元注解小结

热门文章

  1. mongo 导入import 导出 exprot操作
  2. Java同步数据结构之ConcurrentSkipListMap/ConcurrentSkipListSet
  3. net start mysql 发生系统错误2 系统找不到指定的文件
  4. Flutter中的事件广播event_bus的基本使用
  5. mysql 对应数据库服务器配置 所能承受的tps和qps
  6. Python 函数返回值、作用域
  7. python配置yum源
  8. 使用 Sublime + PlantUML 高效地画图
  9. iOS-UIScrollView滚动视图(转)
  10. 搭建sqli靶场