OpenId身份验证漏洞

OpenId身份验证漏洞,openid,dotnetopenauth,Openid,Dotnetopenauth,一段时间前我已经实现了OpenId身份验证,为了记住用户,我使用了ClaimedIdentifier(用DotNetOpenAuth的术语)——身份验证后OpenId提供者返回的字符串 但突然间我明白了这个解决方案有一个弱点。让我们设想有一个OpenId提供者1为用户1返回标识的“identifier1”。现在,如果我知道这个标识符,我可以启动我的自定义OpenId提供程序并返回相同的标识符,这样我就可以在User1下登录 现在我考虑存储openid_标识符(openid提供者url)+Clai

一段时间前我已经实现了OpenId身份验证,为了记住用户,我使用了ClaimedIdentifier(用DotNetOpenAuth的术语)——身份验证后OpenId提供者返回的字符串

但突然间我明白了这个解决方案有一个弱点。让我们设想有一个OpenId提供者1为用户1返回标识的“identifier1”。现在,如果我知道这个标识符,我可以启动我的自定义OpenId提供程序并返回相同的标识符,这样我就可以在User1下登录

现在我考虑存储openid_标识符(openid提供者url)+ClaimedIdentifier


我的想法对吗?我没有错过任何其他可能的漏洞吗?

实际上,您认为的这个漏洞不是一个漏洞。OpenID协议本身(以及DotNetOpenAuth库)包括防止任意OpenID提供程序断言它不拥有的标识符的保护。因此,不,您不仅不需要将OP端点(您称之为OpenId提供者url)与声明的标识符一起存储,而且如果这样做,您将破坏OpenId的一些灵活性

在这一点上你可能会问,那么它是如何工作的呢?为什么这不是一个漏洞?
答案来自这样一个事实:任何时候,提供商(OP)向依赖方(RP)声明声明的标识符,RP不仅信任OP。它没有理由信任OP,因为正如您所说,任何人都可以设置任意OP。相反,RP接受声明的标识符并对其执行发现。本质上,RP是在询问声明的标识符“OP foo.com是否有权声明您的身份?”只有给定声明标识符的真实OP才能让标识符对此问题说“是”。“否”响应将导致RP拒绝断言,并告诉用户身份验证过程中出现错误