验证领域是否足够安全?

时间:2012-11-21 14:45:42

标签: c# .net openid dotnetopenauth

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

我想在向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)?

1 个答案:

答案 0 :(得分:1)

是的,OpenID领域是可靠的,因为OpenID 2.0和DotNetOpenAuth需要两个步骤:

  1. OpenID return_to网址必须是领域网址的衍生产品。因此,虽然任何人都可以将OpenID请求表示为来自任何依赖方,但所谓的依赖方将始终是实际接收响应的人,因此操作另一个RP的攻击者将无法获得响应。
  2. 某些“开放重定向器”攻击可能允许攻击者使用基于合法域URL的return_to URI,但恰好是将重定向到攻击者网站的URL,从而将断言传递给攻击者。通过调用IsReturnUrlDiscoverable方法,您的代码段包含“RP Discovery”,可以缓解这种情况。 RP应在其RP Discovery XRDS文档中明确列出允许的return_to URL,以便不允许打开重定向器端点。
  3. 所有人都说,OpenID主要是关于识别用户 - 而不是授权他们使用特定的RP。因此,虽然你正在做的事情可能没问题,但是它有点偏离OpenID使用的方方面面,所以请仔细考虑安全隐患(听起来你现在正在做)。