有多种机制(有些已经不存在了),这些机制使我可以使用服务B(身份提供者/ IdP)授予的令牌访问服务A(依赖方/ RP)。通常,这些代替用户名和密码登录。 IdP协议的示例包括:


OpenID 2.0
OpenID Connect
IndieAuth
Mozilla Persona
Portier
...以及显然是Google登录和Facebook登录

是什么阻止了IdP获得对我在RP上帐户的访问权限?在IdP上具有sysadmin特权的错误参与者肯定可以:


在服务A上尝试登录
...启动从A到B的令牌请求
在服务B生成令牌(不需要我的凭据)
...将有效响应返回给A
现在在A处访问我的帐户

我在问一个一般性问题,但作为一个具体示例,是什么原因阻止了一位不好的Facebook管理员以我的名字发布Stack Exchange问​​题?




(根据https://developers.google.com/identity/protocols/OAuth2改编的草图,但请注意,所引用的协议只是一个示例。)

评论

这取决于您是仅使用第三方登录名还是2FA

我不认为您应该担心Facebook或Google自己以您的名义发布内容。 Facebook密码薄弱并且能够使用该密码访问其他站点,这让我感到更加担忧。

通常在这种情况下,您在服务A上没有帐户,这就是为什么首先使用服务B中的令牌的原因

@MarioTrucco的意思是,您是从服务B帐户发布到服务A,而不是使用服务B令牌登录服务A?欺骗问题仍然存在(服务B可以在接受来自服务B的令牌的任何服务上欺骗您)

……这似乎是一个普遍问题的具体示例:“什么阻止我的身份提供者代表我做某事?” (无论好坏)。它是OAuth2的事实有些争议。答案是“无”-就像您相信政府不会颁发重复的驾驶执照来冒充您(毕竟,他们控制打印机制)。

#1 楼

是的,他们可以。

简单的答案:您通常通过用户名和密码以某种方式向身份提供者进行身份验证。错误的管理员可以存储传输的凭证并重新使用它们。此攻击不取决于后端的实现方式。

通常,身份提供者的密码根本不用于对第三方服务的身份验证,这意味着您的身份提供者实际上具有您的登录密钥(您根本没有密码)。

您可以考虑将密码合并到身份验证过程中的方案,而不用事后不进行加密存储,但是实际上我不知道这样的方案方案。

评论


评论不作进一步讨论;此对话已移至聊天。

– schroeder♦
18年6月14日在14:48

#2 楼

TL; DR:
可以欺骗您的Facebook登录名的不良Facebook管理员可以在您的名字下发布不良信息在Facebook上,通常被认为比在Stack Exchange上发布问题要糟糕。

我的更详细的答案集中于OAuth 2.0,这是此用例的行业标准,并且位于OP1中Google的授权草图之后。

OAuth 2.0框架最初并不仅仅用于身份验证,而是有关授权的更一般使用情况:服务A想要访问用户在服务B上拥有的某些资源。例如,用户在服务A(照片编辑应用)上拥有两个帐户和服务B(Google云端硬盘)上。使用OAuth 2.0,用户会向应用授予访问其在Goole Drive上的照片的权限。注意事项:


服务A必须是在服务B上的已注册应用程序:在该示例中,开发人员必须在Google Developer上注册其照片编辑应用程序。启动授权流时,服务A通过客户端ID和客户端密钥(如果是服务器端流)或客户端ID和主机名(如果是客户端流)向服务B标识自己。
服务A将用户重定向到服务B的授权端点,并且用户只需要在服务B上输入其服务B的凭据。服务A无法欺骗服务B的登录名,因为它无法控制授权端点。服务B无法欺骗服务A的登录名,因为该登录名不是用户提供的。

服务A可以用来访问服务B上用户资源的最终令牌响应带有作用域。服务B将允许服务A仅访问授权范围内的资源。范围在重定向到的授权窗口中向用户说明。在示例中,来自Google云端硬盘的授权窗口将说明“此照片编辑应用可以在云端硬盘上查看和修改您的照片”之类的内容。然后,Google会允许该应用访问照片,但不允许在Google Plus上发布某些内容,因为它不在授权范围之内。

第三方登录是一种非常常见的特殊情况,其中资源用户拥有的是他们在服务B上的基本帐户信息。开发人员没有选择要求用户在其服务上进行注册,而是选择要求Google验证用户的身份。

只有当服务A信任服务B
,用户信任服务B

,系统才可以正常工作是指用户不必信任服务A。

但是,如果用户对服务A的信任程度高于服务B,则他们不应使用第三方登录名并在服务A上进行注册(选项可用)。

1原始帖子

评论


+1!关键点:除了资源所有者流中(在本用例中不会发生),服务A永远不会捕获您的凭据。他们只能执行令牌范围内允许的操作。

– Wes Toleman
18年5月30日在12:28

#3 楼

是的他们可以。马里奥(Mario)解释了其技术原理。在这里,我将重点介绍信任部分。

您在计算机上执行的任何操作都意味着信任。您信任系统和手机的OS编辑器。您信任在其上安装的任何程序的所有编辑器。您信任您使用的任何在线服务。而且您相信银行不对您的帐户进行任何操作(这超出了信息学的范围...)。

但是在信任级别上还是有一定程度的。我相信航班预订系统足以购买他们的东西,但是我不相信他们会提供银行证明。无论如何,我对我的密码保险库程序足够信任。

因此,在信任链中,重要的是:链中的其中一个行为者是否仅应享有比整体行动更低的信任度?使用Facebook帐户进行SO可能很好,攻击的风险和可能的后果与我对Facebook的信任兼容,恕我直言。但是我永远不会在我的银行使用Facebook帐户(无论如何他们都不会提供)。当然,信任系统意味着对任何管理员的信任。

#4 楼

是。这就是为什么有可用的技术使此操作不可能实现的原因(例如,基于属性的隐私保护凭据),但到现在为止,对于普通用户来说,这被认为是不切实际的(而且我还不知道任何具有合理可用性的软件,而且零浏览器对此的支持)。这项技术不允许他们假冒您,甚至更多,因此无需连接中央提供商即可完成登录。 (当前方法的问题是,您将正在使用的站点泄漏给身份提供者)。