我正在开发一个用于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)?
答案 0 :(得分:1)
是的,OpenID领域是可靠的,因为OpenID 2.0和DotNetOpenAuth需要两个步骤:
IsReturnUrlDiscoverable
方法,您的代码段包含“RP Discovery”,可以缓解这种情况。 RP应在其RP Discovery XRDS文档中明确列出允许的return_to URL,以便不允许打开重定向器端点。所有人都说,OpenID主要是关于识别用户 - 而不是授权他们使用特定的RP。因此,虽然你正在做的事情可能没问题,但是它有点偏离OpenID使用的方方面面,所以请仔细考虑安全隐患(听起来你现在正在做)。