Я пытаюсь опубликовать форму из iframe. Но я получаю ошибку 400 и не знаю почему. В iframe он показывает запросы GET, и я также установил "X-Frame-Options", "ALLOW-FROM ...
в заголовках методов GET и POST.
Вот просьба:
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
Когда я отправляю ту же форму непосредственно с того же URL-адреса в браузере, я не получаю никаких ошибок.
Как исправить в iframe?
Как я могу это исправить?
Первое, что нужно сделать, это подтвердить, действительно ли проблема в этом. Вы можете временно отключить проверку CSRF, используя предложение здесь.
Я просто установил [IgnoreAntiforgeryToken (Order = 1001)] для моей pageModel, и он нормально перенаправился. Но раньше я хранил некоторые данные во временных данных. Но после перенаправления временные данные не содержат данных, как при отправке формы напрямую.
Я не знаю конкретных деталей того, как это работает с iframe, но похоже, что файлы cookie не отправляются, когда вы делаете запрос изнутри своего iframe. Надеюсь, это даст вам хоть что-то, на что стоит обратить внимание.
В порядке. Я сосредоточусь на этих временных данных позже. Что делать с проблемой смягчения CSRF? потому что я не могу отключить AntiforgeryToken из соображений безопасности.
Все это будет частью одного вопроса. И защита CSRF, и функция TempData используют файлы cookie.
Кроме того, я просто устанавливаю данные для файла cookie в действии публикации и получаю их обратно после перенаправления. Просто временные данные выглядят иначе, чем файл cookie.
После некоторого теста я вижу, что cookie работает в IFrames, но не в сеансе.
Я столкнулся с такой же ошибкой при использовании основного приложения Asp.net (Razor Pages) в Iframe на сайте SharePoint Online.
Решение:
Добавьте следующую конфигурацию в файл Startup.cs вашего основного приложения asp.net. (возможно, вам придется добавить ссылку на Microsoft.AspNetCore.Mvc)
Шаг 1
Включите Политика безопасности контента, чтобы добавить родительский 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 Включите проверку Игнорировать токен защиты от подделки.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorPagesOptions(_options =>
{
_options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});
}
Кроме того, вам необходимо проверить, не написали ли вы код для предотвращения CSRF, как показано ниже:
options.Filters.Add (новый AutoValidateAntiforgeryTokenAttribute ()); в файле запуска ().
На это ушло 5 часов, как я пытался с JSONP, CORS и CSRF.
Похоже, это может быть проблема смягчения CSRF.