如何在 iFrame 中允许特定页面 - ASP.NET 核心
How to allow specific page in an iFrame - ASP.NET Core
我们正在开发一个网络项目 (ASP.NET Core 3.1)。我们需要允许在其他来源的 iframe 中仅打开特定页面。不应通过 iFrame 访问所有其他页面。
我们尝试了以下几种方法:
- 我们已尝试使用中间件从 header 中删除
X-Frame-Options: SAMEORIGIN
。
public async Task Invoke(HttpContext context)
{
context.Response.OnStarting((state) =>
{
_headersToRemove.ForEach(header =>
{
if (context.Response.Headers.ContainsKey(header))
{
context.Response.Headers.Remove(header);
}
});
return Task.FromResult(0);
}, null);
await next.Invoke(context);
}
但是,没有在中间件中获取服务器 headers (X-Frame-Options)。
- 我们使用了内容安全策略
<add name="Content-Security-Policy" value="frame-ancestors 'self' *.website.com" />
这适用于指定的来源,但是,它允许在 iframe 中加载所有页面。
- 我们已尝试从
web.config
文件中删除 X-Frame-Options
header
<add name="X-Frame-Options" value="SAMEORIGIN" />
- 我们试图抑制
X-Frame-Options
header,但它允许所有域
public static void AddAntiForgery(this IServiceCollection services)
{
services.AddAntiforgery(options =>
{
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.Cookie.HttpOnly = true;
options.Cookie.Name = "_app";
options.Cookie.SameSite = SameSiteMode.Strict;
options.SuppressXFrameOptionsHeader = true;
});
}
那么,问题是,我们如何才能只允许来自其他域的 iframe 中的特定页面?
编辑
我已经启用了 CORS。
<add name="Access-Control-Allow-Origin" value="*" />
您可以仅将 [EnableCors]
属性用于特定的控制器方法,而不是全局应用它:https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api#scope-rules-for-enablecors
我们尝试了几种不同的方法并提出了解决方案。
首先,需要从网络配置文件中删除 <add name="X-Frame-Options" value="SAMEORIGIN" />
。
其次,以编程方式为所有需要在 iFrame 中打开页面的请求添加 X-Frame-Options
。
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/controller/action"), appBuilder =>
{
appBuilder.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
await next();
});
});
我们正在开发一个网络项目 (ASP.NET Core 3.1)。我们需要允许在其他来源的 iframe 中仅打开特定页面。不应通过 iFrame 访问所有其他页面。
我们尝试了以下几种方法:
- 我们已尝试使用中间件从 header 中删除
X-Frame-Options: SAMEORIGIN
。
public async Task Invoke(HttpContext context)
{
context.Response.OnStarting((state) =>
{
_headersToRemove.ForEach(header =>
{
if (context.Response.Headers.ContainsKey(header))
{
context.Response.Headers.Remove(header);
}
});
return Task.FromResult(0);
}, null);
await next.Invoke(context);
}
但是,没有在中间件中获取服务器 headers (X-Frame-Options)。
- 我们使用了内容安全策略
<add name="Content-Security-Policy" value="frame-ancestors 'self' *.website.com" />
这适用于指定的来源,但是,它允许在 iframe 中加载所有页面。
- 我们已尝试从
web.config
文件中删除X-Frame-Options
header
<add name="X-Frame-Options" value="SAMEORIGIN" />
- 我们试图抑制
X-Frame-Options
header,但它允许所有域
public static void AddAntiForgery(this IServiceCollection services)
{
services.AddAntiforgery(options =>
{
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.Cookie.HttpOnly = true;
options.Cookie.Name = "_app";
options.Cookie.SameSite = SameSiteMode.Strict;
options.SuppressXFrameOptionsHeader = true;
});
}
那么,问题是,我们如何才能只允许来自其他域的 iframe 中的特定页面?
编辑
我已经启用了 CORS。
<add name="Access-Control-Allow-Origin" value="*" />
您可以仅将 [EnableCors]
属性用于特定的控制器方法,而不是全局应用它:https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api#scope-rules-for-enablecors
我们尝试了几种不同的方法并提出了解决方案。
首先,需要从网络配置文件中删除 <add name="X-Frame-Options" value="SAMEORIGIN" />
。
其次,以编程方式为所有需要在 iFrame 中打开页面的请求添加 X-Frame-Options
。
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/controller/action"), appBuilder =>
{
appBuilder.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
await next();
});
});