用于SSO的PHP + ADFS(通过OAuth)-如何设置ADFS?

Rah*_*san 5 php single-sign-on oauth-2.0 adfs3.0

我试着去使用ADFSSSO一个项目。该项目PHP正在进行中,我正试图为此使用OAuth

那么,设置ADFS与OAuth2配合使用的步骤是什么?我对ADFS一无所知,因此无法获得有关OAuth2设置的任何直接指南。

非常感谢。

Vla*_*ykh 2

我发现这个问题很老了。但如果其他人能到达这里,我有一些答案,应该对 2019 年 3 月有用。

让我从总体概述开始。

单点登录

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

SSO:用户同意。 个人谷歌帐户

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

SSO:用户同意。 通过 Auth0 使用 Microsoft 帐户登录

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

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

OpenID 连接流程

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:使用 ADFS 的本机客户端找到非常详细的文档,其中包含“本机应用程序场景”的插图

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

JavaScript 前端

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

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

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

PHP后端

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

因此,对于 PHP 只有一个:phpOIDC

验证

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

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

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

  • 使用公钥验证 JWT 签名
  • 检查issuer正确的颁发者(身份提供商)
  • 检查aud(受众)是否有正确的客户端 ID
  • 检查exp(过期时间戳)
  • 检查索赔