【问题标题】:Is it safe to identify OpenID users by email address if the provider is trusted?如果提供商受信任,通过电子邮件地址识别 OpenID 用户是否安全?
【发布时间】:2012-02-21 07:15:04
【问题描述】:

我正在使用 DotNetOpenAuth 进行 OpenID 登录。 Google 的提供程序会根据调用者的领域(主机名 + 端口)返回不同的 ClaimedIdentifier。

根据 OpenID 身份验证回调返回的电子邮件地址与声明的标识符本身验证登录是否安全?即,如果我们在电子邮件而不是声称的 ID 上进行验证,用户是否可以伪造他们的电子邮件地址,从而获得对另一个用户帐户的访问权限?

我认为这样做只要提供商是受信任的就可以了 - 即我们可以相信 Google 不会允许用户使用其他人的电子邮件地址登录。

【问题讨论】:

    标签: security openid dotnetopenauth


    【解决方案1】:

    OpenID 2.0 协议的安全模型是围绕声明的标识符构建的,而不是电子邮件地址。所以最好的方法是让你的 Realm 保持一致。如果你能做到,那就是最好的方法。

    将电子邮件地址存储在用户表中也是一个好主意,这样如果您的领域必须发生变化(也许您的公司被另一家收购),您就可以迁移你的用户。但是,如果您打算这样做,您还应该在收到电子邮件地址时存储身份验证期间的 OP Endpoint 是什么,以便您知道是否可以信任它。

    通常,完全信任电子邮件地址是不安全的。如果您信任提供商(在您的情况下是 Google)为您提供经过验证的电子邮件地址,那么您可以信任电子邮件地址如果您验证它实际上是对用户进行身份验证的提供商。 这只能通过验证 IAuthenticationResponse.Provider.Uri 值是您信任的值来正确完成。不能仅通过提供“使用 Google 登录”按钮隐式完成因为 OpenID 的“不请自来的断言”功能,它允许用户使用任意提供者登录,而不管 RP 在其 UI 中提供什么。由于声明标识符和本地标识符之间的差异,因此无法通过检查声明标识符的域来完成。

    【讨论】:

    • 那么本质上,下面的逻辑是安全的吗?如果提供商是 Google,则使用电子邮件验证身份验证,否则使用声明的 ID 验证身份验证
    • Doesn't Stack Exchange 实际上不会这样做,因为“我的登录”对话框指出“使用上述电子邮件的任何 Google、Facebook、Yahoo 或 Stack Exchange 帐户登录”......这意味着对于那些受信任的提供商,他们只需在电子邮件而不是声明的 ID 上进行验证,并将声明的 ID 用于任何不受信任的提供商。
    • 其实看这个(blog.stackoverflow.com/2010/04/openid-one-year-later),好像是这样的。
    【解决方案2】:

    在比较中使用电子邮件之前,我会先验证声称的 ID 确实是谷歌 ID。那也是how StackOverflow does it

    【讨论】:

    • 检查声明的标识符是否为 Google 标识符是一项重要的预防措施,但并不是最好的。最好的方法是检查发出断言的 OP 端点。
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多