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

时间:2016-10-11 04:09:52

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

我尝试在项目中使用ADFS作为SSO。该项目位于PHP,我正在尝试使用OAuth

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

  

我看到这个问题已经很老了。但是如果其他人愿意   到达这里,我有一些答案应该对2019年3月有效。

让我从总体概述开始。

SSO

SSO可以通过个人Google,Facebook,GitHub,Twitter,Microsoft帐户来完成。登录到您的帐户后,您可以不使用密码登录其他系统(例如WordPress或其他任何系统)(如果其他系统已与该Identity Provider集成),并表示您同意(参见下图)。

SSO: user consent. Personal Google Account

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

SSO: user consent. Sign in with Microsoft account via Auth0

在公司网络中,可以基于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://tools.ietf.org/html/rfc8252#section-6

     

注意:尽管到目前为止,虽然推荐使用PKCE作为保护本机应用程序的机制,但该建议适用于所有OAuth客户端,包括Web应用程序。

     

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

  1. Implicit flow被视为不推荐
  

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

     

https://tools.ietf.org/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(到期时间戳记)
  • 检查索赔