如何为身份服务器启用内容安全策略?

问题描述

我有一个连接到身份服务器的微型前端。为了使用户能够访问微前端,需要通过此ID服务器对用户进行身份验证。微型前端需要嵌入到我的主应用程序的iframe中,但是由于该微型前端需要ID服务器,因此控制台上出现错误。在嵌入此微型前端之前,一切工作都很好,但是一旦它进入iframe,我就会遇到这个问题。

Refused to frame 'https://localhost:44300/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'none'".

我尝试将其包含在身份服务器的web.config文件中,导致控制台上出现上述错误

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Content-Security-Policy" value="frame-ancestors ''" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

似乎ID服务器不允许将其内容嵌入到iframe中。这可能不是一个好习惯,但是根据我的要求,我想知道如何启用它。

更新

在这里定义csp

public override void OnResultExecuting(ResultExecutingContext context)
        {
            var result = context.Result;
            if (result is ViewResult)
            {
                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
                if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Type-Options"))
                {
                    context.HttpContext.Response.Headers.Add("X-Content-Type-Options","nosniff");
                }

                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/x-frame-options
                if (!context.HttpContext.Response.Headers.ContainsKey("x-frame-options"))
                {
                    context.HttpContext.Response.Headers.Add("x-frame-options","SAMEORIGIN");
                }

                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
                var csp = "default-src 'self'; object-src 'none'; frame-ancestors 'none'; sandBox allow-forms allow-same-origin allow-scripts; base-uri 'self';";
                // also consider adding upgrade-insecure-requests once you have HTTPS in place for production
                //csp += "upgrade-insecure-requests;";
                // also an example if you need client images to be displayed from twitter
                // csp += "img-src 'self' https://pbs.twimg.com;";

                // once for standards compliant browsers
                if (!context.HttpContext.Response.Headers.ContainsKey("Content-Security-Policy"))
                {
                    context.HttpContext.Response.Headers.Add("Content-Security-Policy",csp);
                }
                // and once again for IE
                if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Security-Policy"))
                {
                    context.HttpContext.Response.Headers.Add("X-Content-Security-Policy",csp);
                }

                // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
                var referrer_policy = "no-referrer";
                if (!context.HttpContext.Response.Headers.ContainsKey("Referrer-Policy"))
                {
                    context.HttpContext.Response.Headers.Add("Referrer-Policy",referrer_policy);
                }
            }
        }

解决方法

尝试对iServer IdentityServer进行内嵌操作确实是一个坏主意,因为这样用户很难知道自己实际登录的位置。

如果仍然要更改它,则需要查看 QuickStart 文件夹中的 SecurityHeadersAttribute.cs 文件,该文件定义了CSP。

在此文件中,您可以调整发送到浏览器的安全标头。您需要查看CSP和X-Frame-Options标头。