来自Iframe的POST表单时,Asp剃刀页面返回400个代码

时间:2018-12-18 20:58:56

标签: asp.net-core razor-pages

我正在尝试从iframe发布表单。但是我收到400错误,我不知道为什么。在iframe中,它显示GET请求,并且我还在GET和POST方法标头中设置了"X-Frame-Options", "ALLOW-FROM ...

这是请求:

Host: localhost:52136
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:52136/
Content-Type: application/x-www-form-urlencoded
Content-Length: 796
Connection: keep-alive
Upgrade-Insecure-Requests: 1

响应:

HTTP/1.1 400 Bad Request
Server: Kestrel
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcR2VydmlsIERvdWJhbFxzb3VyY2VccmVwb3NcQWNvbXBhIGNoYXJ0XE9ubGluZUFnZW5jeQ==?=
X-Powered-By: ASP.NET
Date: Tue, 18 Dec 2018 20:41:55 GMT
Content-Length: 0

当我直接从浏览器中的同一网址提交同一表格时,我没有收到任何错误。

如何在iframe中修复它?

2 个答案:

答案 0 :(得分:5)

在SharePoint Online网站的iframe中使用Asp.net核心应用(剃刀页面)时遇到了相同的错误。

解决方案:

在asp.net核心应用的Startup.cs文件中添加以下配置。 (您可能必须添加Microsoft.AspNetCore.Mvc的引用)

第1步

启用Content Security Policy以将父URL添加到受信任的CORS域。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.Use(async (context, next) =>    
    {
        context.Response.Headers.Add("Content-Security-Policy", "frame-ancestors https://mysharepointparentsite.sharepoint.com/");
        await next();
    });
}

第2步 启用Ignore Anti Forgery Token验证。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorPagesOptions(_options =>
    {
        _options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
    });
}

答案 1 :(得分:0)

此外,您需要检查是否尚未完成如下所示的CSRF预防代码:

options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());在启动文件()。

花费了5个小时来查找我尝试使用JSONP,CORS和CSRF的时间。