219  
查询码:00000242
.Net Core 如何通过中间件 允许iframe嵌入站点资源
作者: 余承浩 于 2020年05月25日 发布在分类 / 人防组 / 人防后端 下,并于 2020年05月25日 编辑

iframe的作用

完全隔离的css 和 js , 但又可以使用 contentWindow和parent 来通信. 松耦合又不失灵活

问题

通常为了防止被恶意嵌套,网站都会设置允许信任站点进行资源嵌套

强大的Core通信管道中间件

Core允许我们自定义中间件来实现我们想要的功能,例如权限校验,跨域访问,服务注册等等

创建响应头信息修改中间件

 /// <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);
        }
    }

    /// <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 SecurityHeadersPolicy
    {
        public IDictionary<string, string> SetHeaders { get; }
             = new Dictionary<string, string>();

        public ISet<string> RemoveHeaders { get; }
            = new HashSet<string>();
    }

使用中间件

在startup.cs的Configure方法中使用中间件进行响应头信息修改

            //允许iframe嵌入资源
            app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
              .AddCustomHeader("X-Frame-Options", "AllowAll")
              .AddCustomHeader("Access-Control-Allow-Credentials", "true")
              .AddCustomHeader("Access-Control-Allow-Origin","http://localhost:8081,http://localhost:8082")
            );


 推荐知识

 历史版本

修改日期 修改人 备注
2020-05-25 17:59:08[当前版本] 余承浩 格式调整
2020-05-25 11:56:47 余承浩 创建版本

  目录
    知识分享平台 -V 4.8.7 -wcp