【问题标题】:PHP + ADFS for SSO (via OAuth) - How to setup ADFS?用于 SSO 的 PHP + ADFS(通过 OAuth) - 如何设置 ADFS?
【发布时间】:2017-02-19 14:08:51
【问题描述】:

我正在尝试在一个项目中使用ADFS 代替SSO。该项目在PHP 上,我试图为此使用OAuth

那么设置 ADFS 以使用 OAuth2 的步骤是什么?我不了解 ADFS,也无法在此处获得有关 OAuth2 设置的任何直接指南。

非常感谢。

【问题讨论】:

  • 亲爱的 Raheel,我回答你的问题了吗?
  • 亲爱的弗拉基米尔,我已经在 2 年前用另一种方法解决了这个问题。所以我不知道!

标签: php oauth-2.0 single-sign-on adfs3.0


【解决方案1】:

我看到这个问题很老了。但万一其他人会 到这里,我有一些答案应该适合 2019 年 3 月。

让我从一般概述开始。

SSO

SSO 可以通过个人 Google、Facebook、GitHub、Twitter、Microsoft 帐户完成。登录您的帐户后,您可以在没有密码的情况下登录其他系统(例如 WordPress 或任何其他系统)(如果其他系统与该身份提供者集成)并且您同意(见下图)。

有些服务的主要重点是提供身份提供商/SSO 功能(例如 Okta、Auth0、Google Cloud Identity、Azure Active Directory、AWS IAM)。

在企业网络中,用户可以基于 AD 帐户静默登录,而无需通过 ADFS 输入凭据。

实际上,ADFS 支持不同的身份验证协议,例如 SAML、WS-Fed 和 OAuth。但现在服务通常实现OpenID Connect,它在OAuth 2.0 协议之上运行。

OpenID Connect 流程

OpenID Connect 定义了许多身份验证流程。 最优选的是:

  1. Authorization Code Flow with PKCE(单页应用、原生应用)

如果你使用oidc-client-js,你应该使用response_type=code来使用PKCE。

公共原生应用客户端必须实现代码交换证明密钥 (PKCE RFC7636])

https://www.rfc-editor.org/rfc/rfc8252#section-6

注意:尽管迄今为止建议将 PKCE 作为保护本机应用程序的一种机制,但此建议适用于所有类型的 OAuth 客户端,包括 Web 应用程序。

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-12#section-3.1.1

  1. Implicit flow 被视为不推荐

客户端不应使用隐式授权和任何其他导致授权服务器在授权响应中发出访问令牌的响应类型

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-09

  1. Client credentials flow。用于服务间通信。

如何配置 ADFS?

您可以在Microsoft Docs: Native client with ADFS 找到非常详细的文档以及“原生应用场景”的插图。

如果您不使用 ADFS,您可以在 playground 中使用 PKCE 流设置。

JavaScript 前端

切勿将客户端机密存储在 JS 前端或移动应用等公共应用程序中。它不适用于 PKCE 流程,但以防万一。

如果您有现代 SPA 应用程序(例如 Angular 或 React),这意味着前端应该只有 client_id 以使最终用户能够通过 ADFS 在浏览器中获取 JWT access_token。你不需要任何client_secret

oidc-client-js 可以帮助您。确保 code_verifier 与令牌请求一起发送(这意味着您正在使用更安全的 PKCE 流)。

PHP 后端

在 PHP 方面,您需要验证访问令牌。您可以根据that article自行实现工作流程。但最好使用您可以在此页面上找到的 OpenID 认证库(不仅适用于 PHP): https://openid.net/developers/certified/

所以,对于 PHP,只有一个:phpOIDC

身份验证

OAuth 2.0 只能帮助您进行身份验证(识别用户身份)。

您很可能希望对不同的用户拥有不同的权限。 ADFS 中的 OpenID Connect 实施使您能够将 AD 组映射到令牌声明。因此,您可以在后端解码 JWT 访问令牌并实现基于声明的授权。

要使用 JWT 声明,请务必正确验证令牌和颁发者的真实性:

  • 使用公钥验证 JWT 签名
  • 检查 issuer 以获取正确的颁发者(身份提供者)
  • 检查aud(观众)以获取正确的客户 ID
  • 检查exp(过期时间戳)
  • 检查声明

【讨论】:

猜你喜欢
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多