如何正确使用 CORS 和 OpenID Connect?

信息安全 验证 同源策略 开放式连接 oauth2 科尔斯
2021-08-22 03:14:13

在几个博客、问答网站和评论中似乎有许多问题会询问问题的变体:

如何正确使用 CORS 和 OpenID Connect?

这些问题的上下文通常适用于以下角色之一:

  • Facebook、Azure AD 等发行者(这是规范中的“OP”或“OpenID Provider”)
  • 依赖方,例如 StackExchange 或 FB Connect Auth(规范中的网站“客户端”)

在查看问题时,有时提问者或回答者会参考一些特定的配置文件,而不是明确地将用例映射到相关的OpenID Connect Flow

  • 带有重定向或 Javascript 的 Web 浏览器身份验证
  • 单页应用程序 (SPA)
  • 一个活跃的客户端(Flash、浏览器插件、本机手机应用程序)
  • 设备流程(激活 AppleTV)

我正在寻找一个或多个正确答案来描述 CORS 如何以及何时适合给定角色或使用配置文件。由于CORS wrt OpenID Connect正确使用的数量是有限的,我认为可能有几个正确的答案。

问题(改写)

  1. 应该在 OP 或客户端服务器上使用哪些 CORS 策略?

  2. 应该使用哪些 CORS 策略:

    • 隐式
    • 授权码
    • 杂交种
    • 客户端凭据
    • 资源所有者密码
    • 刷新令牌
    • 延期补助金
  3. 什么时候 CORS 不适用,或者特别是对安全的威胁?

2个回答

CORS 何时会对安全构成风险

CORS 可以覆盖默认规则,因此过于宽松的 CORS 策略可能比没有策略更糟糕。

CORS 应该有多宽松

CORS 应尽可能限制,同时仍允许您希望启用的用例。CORS 可以帮助防止 CSRF 攻击,因此应注意不要过度削弱这种防御。

CORS 适用于何处

CORS 仅适用于浏览器内部,因此不适用于浏览器外部的选项,例如本机应用程序和设备登录。

  • 带有重定向或 Javascript 的 Web 浏览器身份验证

    • CORS 适用
  • 单页应用程序 (SPA)

    • CORS 适用
  • 一个活跃的客户端(Flash、浏览器插件、本机手机应用程序)

    • CORS 不适用- 不在浏览器内部
  • 设备流程(激活 AppleTV)

    • CORS 不适用- 不在浏览器内部

这个答案很简短,但我认为 CORS 在这里根本没有真正发挥作用,因为“应用程序”和身份验证提供程序之间的通信是通过 HTTP 重定向完成的;即,在正确的实现中没有进行跨域 AJAX JS 调用。