关于重定向:为什么在OpenID 2中使用HTML表单重定向?

关于重定向:为什么在OpenID 2中使用HTML表单重定向?

Why is HTML form redirection used in OpenID 2?

为什么要执行自动HTML发布而不是简单的重定向?

这样是不是开发人员可以在已知OpenID时自动生成将目录发布到远程服务器的登录表单?

例如。

  • 用户尚未登录并访问您的登录页面。
  • 您从cookie中检测到用户的openID。
  • 生成的表单直接发布到远程OpenID服务器。
  • 远程服务器将用户重定向回网站。
  • 网站登录用户。
  • 如果是这样,我可以看到好处。但是,这假设您在用户注销时将用户的openID保留在cookie中。

    我几乎找不到有关如何最好地实现此规范的信息。

    请参阅官方规范中的HTML FORM重定向:

    http://openid.net/specs/openid-authentication-2_0.html#indirect_comm

    我通过查看PHP OpenID库(版本2.1.1)发现了这一点。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // Redirect the user to the OpenID server for authentication.
    // Store the token for this authentication so we can verify the
    // response.

    // For OpenID 1, send a redirect.  For OpenID 2, use a Javascript
    // form to send a POST request to the server.
    if ($auth_request->shouldSendRedirect()) {
        $redirect_url = $auth_request->redirectURL(getTrustRoot(),
                                                   getReturnTo());

        // If the redirect URL can't be built, display an error
        // message.
        if (Auth_OpenID::isFailure($redirect_url)) {
            displayError("Could not redirect to server:" . $redirect_url->message);
        } else {
            // Send redirect.
            header("Location:".$redirect_url);
        }
    } else {
        // Generate form markup and render it.
        $form_id = 'openid_message';
        $form_html = $auth_request->htmlMarkup(getTrustRoot(), getReturnTo(),
                                               false, array('id' => $form_id));

        // Display an error if the form markup couldn't be generated;
        // otherwise, render the HTML.
        if (Auth_OpenID::isFailure($form_html)) {
            displayError("Could not redirect to server:" . $form_html->message);
        } else {
            print $form_html;
        }
    }


    我可以想到几个原因:

    • 默默无闻的安全性-篡改POST提交要比GET花费更多的工作
    • 缓存和重新提交规则对POST的限制比对GET的限制更大。不过,我不太确定这对于OpenID用例是否重要。
    • 漫游器不会遵循POST表单,但会遵循重定向。这可能会影响服务器负载。
    • 不同的浏览器对GET请求的最大长度有所不同-但它们都不像POST一样大。
    • 某些浏览器会警告重定向到另一个域。如果您要向非HTTPS网址提交POST,他们也会警告您。
    • 通过关闭JavaScript,我可以获得相对安全的体验,而不会被无提示地重定向到另一个域。

    我不知道这些是选择POST的一个灌篮理由-除非发送的数据量超过某些主流浏览器的querystring长度。


    正如Mark Brackett所说,主要动机是通过使用重定向和GET来限制有效负载大小。有些实现足够聪明,仅在消息超过一定大小时才使用POST,因为POST技术肯定有缺点。 (其中最重要的是您的"后退"按钮不起作用的事实。)其他实现(例如您引用的示例代码)则出于简单性和一致性的考虑,并省略了该条件。


    SAML Web浏览器SSO配置文件使用相同的方法。使用HTML Post重定向的主要动机是:

    • 有效负载的长度几乎是无限的:在SAML中,有效负载是一个XML文档,该文档使用XMLDSig和base64编码。它大于URL的通常1024个字符的限制(最佳实践不仅支持任何浏览器,而且还支持中间网络设备,例如防火墙,反向代理,负载平衡器)。

    • W3C HTTP标准说GET是幂等的(多次执行相同的URL GET应该总是产生相同的响应),因此可以沿途进行缓存,而POST则不行,并且必须到达URL目标。 OpenID HTML表单POST或SAML HTML表单POST的响应不应被缓存。它必须到达目标才能启动已认证的会话。

    您可能会争辩说,使用HTTP GET重定向也可以正常工作,因为URL查询总是在变化,而实践是正确的。但是,这将是W3C标准的一种解决方法,因此,只要双方都同意,则不应将其作为标准,而应将其作为替代实现。


    推荐阅读

      程序执行linux命令?

      程序执行linux命令?,系统,工作,地址,环境,信息,管理,命令,文件,目录,程序,lin

      linux执行2个命令?

      linux执行2个命令?,工作,系统,基础,命令,基础知识,信息,管理,在线,概念,第一

      linux命令批量执行?

      linux命令批量执行?,系统,代码,工作,周期性,数据,定期,环境,命令,文件,脚本,l

      linux二进制执行命令?

      linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

      linux执行退出命令?

      linux执行退出命令?,档案,状态,工作,命令,信息,地址,电脑,系统,编辑,文件,lin

      linux中后台执行命令?

      linux中后台执行命令?,系统,状态,暂停,灵活,电脑,网络,服务,第一,名字,命令,l

      linux常用的执行命令?

      linux常用的执行命令?,系统,地址,工作,基础,标准,命令,工具,环境,信息,代码,L

      linux执行线程命令?

      linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,lin

      linux执行多条命令?

      linux执行多条命令?,数据,通信,管理,系统,命令,标准,信息,工具,代码,环境,Lin

      linux常用重定向命令?

      linux常用重定向命令?,标准,信息,设备,系统,文件,命令,内容,符号,终端,脚本,l

      linux退出命令未执行?

      linux退出命令未执行?,服务,工具,代码,环境,数据,官网,命令,用户,脚本,字符

      linux动态执行命令?

      linux动态执行命令?,时间,信息,名字,工作,网上,业务,工具,对比,地址,下来,如

      linux命令执行次数?

      linux命令执行次数?,时间,系统,地址,命令,数据,管理,工具,信息,环境,历史,lin

      linux命令一起执行?

      linux命令一起执行?,系统,标准,设备,地方,软件,代码,网站,网络,周期性,命令,l

      查看执行的命令linux?

      查看执行的命令linux?,系统,地址,信息,工作,命令,灵活,网络,名称,情况,状态,

      linux重定向命令用法?

      linux重定向命令用法?,标准,设备,系统,人员,信息,文件,命令,终端,内容,符号,L

      linux导出执行命令?

      linux导出执行命令?,数据,系统,命令,下来,位置,时间,工具,服务,文件,指令,lin

      linux持续执行命令?

      linux持续执行命令?,连续,定期,密码,系统,状态,命令,任务,文件,程序,前台,lin

      linux隐藏执行的命令?

      linux隐藏执行的命令?,工作,电脑,系统,地址,标准,信息,管理,命令,目录,软件,

      linux在哪执行命令?

      linux在哪执行命令?,电脑,命令,第一,第三,名字,系统,密码,脚本,终端,方法,怎