QWebEngineView不会通过Content-Security-Policy引荐来源消息加载SAML

时间:2019-01-17 20:24:52

标签: http-headers saml referrer qwebengineview qwebenginepage

我在Ubuntu Linux 17.04上运行Qt 5.11,并尝试使用QWebEngineView加载SAML身份验证页面,该页面应该重定向到登录页面,但会导致错误页面和以下错误:

js:无法识别的Content-Security-Policy指令“引荐来源网址”。

我尝试拦截URL并将HttpHeader'Referer-Policy'设置为'no-referrer',然后使用QWebEngineUrlRequestInterceptor将其呈现给浏览器,但这会导致相同的问题。

我创建了一个示例测试,然后运行它来重现下面包含的问题。我正在从SAML请求的文件中读取HTML字符串,并将其设置为QWebEngineView。 SAML请求在大多数网站上都可以正常运行,但该特定网站却出现上述“引荐来源网址”错误。

我使用PingIdentity作为SAML SSO IDP,但它给我的是一个带有参考号的错误页面。我该如何调试呢?

#include <QApplication>
#include <QCoreApplication>
#include <QGuiApplication>
#include <QWebEngineView>
#include <QWebEngineProfile>
#include <QString>
#include <QFile>
#include <QByteArray>

#include <QWebEngineUrlRequestInterceptor>
#include <QDebug>

class RequestInterceptor : public QWebEngineUrlRequestInterceptor
{
public:
    explicit RequestInterceptor(QObject * parent = Q_NULLPTR) :  QWebEngineUrlRequestInterceptor(parent) {}
    virtual void interceptRequest(QWebEngineUrlRequestInfo & info)   Q_DECL_OVERRIDE;
};

void RequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo & info)
{
    // Intercepting the requested URL
    QUrl url = info.requestUrl();
    qDebug() << "Request URL: " << url;

    // Set HTTP header
    QByteArray httpHeaderName = "Referrer-Policy";
    QByteArray httpHeaderValue = "no-referrer";
    info.setHttpHeader(httpHeaderName, httpHeaderValue);
}

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);

    QWebEngineView * view = new QWebEngineView;
    RequestInterceptor * interceptor = new RequestInterceptor(view);
    QWebEngineProfile * profile = new QWebEngineProfile(view);
    profile->setRequestInterceptor(interceptor);
    QWebEnginePage * page = new QWebEnginePage(profile, view);
    view->setPage(page);

    QFile file("SamlRequest.htm");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return -1;
    }

    QByteArray samlArray;
    while (!file.atEnd())
    {
        samlArray += file.readLine();
    }

    QString samlStr(samlArray);
    view->setHtml(samlStr);

    view->resize(1024, 750);
    view->show();

    return app.exec();
}

0 个答案:

没有答案