1

我正在为 SSO 设置开发 OpenId 提供程序 - 它基本上是一个 Web 应用程序门户,与用户有权访问的任何“应用程序”共享凭据。我设置了提供程序,一切正常,但我有一个关于安全性的问题。

我想在 Provider 向 RP 发送肯定断言之前对其进行一些权限检查;即用户实际上对发出请求的应用程序具有权限。

这是我目前得到的 Provider 代码(只是一个片段,如果需要可以添加更多):

private bool AutoRespondIfPossible(out ActionResult response)
    {
        if (ProviderEndpoint.PendingRequest.IsReturnUrlDiscoverable(OpenIdProvider.Channel.WebRequestHandler) == RelyingPartyDiscoveryResult.Success
            && User.Identity.IsAuthenticated && this.RealmIsValid(ProviderEndpoint.PendingAuthenticationRequest.Realm)) {
                if (ProviderEndpoint.PendingAuthenticationRequest != null) {
                    if (ProviderEndpoint.PendingAuthenticationRequest.IsDirectedIdentity
                        || this.UserControlsIdentifier(ProviderEndpoint.PendingAuthenticationRequest)) {
                            ProviderEndpoint.PendingAuthenticationRequest.IsAuthenticated = true;
                            response = this.SendAssertion();
                            return true;
                    }
                }

                //we don't want anon requests
                if (ProviderEndpoint.PendingAnonymousRequest != null) {
                    ProviderEndpoint.PendingAnonymousRequest.IsApproved = false;
                    response = this.SendAssertion();
                    return true;
                }
        }

        response = null;
        return false;
    }

基本上我正在做的是验证请求的领域(在RealmIsValid方法中)与我的可接受主机名列表中的主机名匹配,然后我根据主机名比较用户权限。

我想知道的是:准确度如何ProviderEndpoint.PendingAuthenticationRequest.Realm?如果我理解正确,领域是由依赖方设置的 - 端点是否有可能从该请求中指定的领域以外的 URI 接收请求?或者我可以安全地假设领域总是准确的(即:匹配依赖方的 URI)?

4

1 回答 1

1

是的,OpenID 领域是可靠的,因为 OpenID 2.0 和 DotNetOpenAuth 采取了两个步骤:

  1. OpenID return_to URL 必须是领域 URL 的派生。因此,尽管任何人都可以制定 OpenID 请求,就好像它来自任何依赖方一样,但所谓的依赖方将始终是实际接收响应的一方,因此操作另一个 RP 的攻击者将无法获得响应。
  2. 一些“开放重定向器”攻击可能允许攻击者使用基于合法 Realm URL 的 return_to URI,但恰好是重定向到攻击者网站的 URL,从而将断言传递给攻击者。IsReturnUrlDiscoverable这可以通过“RP Discovery”得到缓解,您的代码片段在调用该方法时包含该“RP Discovery” 。RP 应在其 RP Discovery XRDS 文档中明确列出允许的 return_to URL,以便不允许打开的重定向器端点。

话虽如此,OpenID 主要是关于识别用户——而不是授权他们使用特定的 RP。因此,虽然您正在做的事情可能很好,但对于 OpenID 的使用来说,它有点偏离常规,所以请仔细考虑安全隐患(就像您现在正在做的那样)。

于 2012-11-23T02:10:51.957 回答