我试图在一个项目中使用ADFS作为SSO。这个项目是在PHP上进行的,我试图为此使用OAuth。
那么,设置ADFS以使用OAuth2的步骤是什么呢?我不知道ADFS,也无法获得任何直接的OAuth2设置指南。
非常感谢。
发布于 2019-03-18 23:21:45
我知道这个问题很老。但万一其他人来这里,我有一些答案,这应该是好的2019年3月。
让我首先概述一下。
SSO
单点登录可以通过个人Google、Facebook、GitHub、Twitter、Microsoft账户完成。登录到您的帐户后,您可以在没有密码的情况下登录到其他系统(例如WordPress或任何其他系统)(如果其他系统与该身份提供者集成在一起)并表示同意(见下图)。

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

在公司网络中,用户可以基于AD帐户静默登录,而无需通过ADFS输入凭据。
实际上,ADFS支持不同的身份验证协议,如SAML、WS和OAuth。但是现在,服务通常都是在OpenID连接协议的基础上实现OAuth 2.0。
OpenID连接流
OpenID连接定义了许多身份验证流。最可取的办法是:
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
Implicit flow被认为是不推荐的客户端不应使用隐式授予和任何其他响应类型,从而导致授权服务器在授权响应中发出访问令牌。 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-09
Client credentials flow。服务对服务的交流。如何配置ADFS?
您可以在Microsoft Docs:带有ADFS的本地客户端上找到包含“本地应用场景”插图的相当详细的文档。
如果不使用ADFS,则可以在游乐场中使用PKCE流设置。
JavaScript前端
从不将客户端机密存储在公共应用程序中,比如JS前端应用程序或移动应用程序。它不适用于PKCE流,但只是以防万一。
如果您有一个现代的SPA应用程序(例如角或反应),这意味着前端应该只有client_id,以便最终用户能够通过ADFS在浏览器中获得JWT access_token。你不需要任何client_secret。
oidc-客户端js可以帮你。确保code_verifier与令牌请求一起发送(这意味着您使用的是更安全的PKCE流)。
PHP后端
在PHP方面,您需要验证访问令牌。根据那篇文章,您可以自己实现工作流。但是最好使用OpenID认证的库,您可以在这个页面上找到这个库(不仅仅用于PHP):https://openid.net/developers/certified/
因此,对于PHP,只有一个:phpOIDC。
Authentication
OAuth 2.0只能帮助您进行身份验证(识别用户身份)。
很可能您希望对不同的用户具有不同的权限。ADFS中的OpenID连接实现提供了将AD组映射到令牌声明的能力。因此,您可以在后端解码JWT访问令牌并实现基于声明的授权。
要使用JWT声明,请确保正确验证令牌和发行者的真实性:
issuer是否有合适的发行者(身份提供者)aud (受众)以获得适当的客户端IDexp (过期时间戳)https://stackoverflow.com/questions/39970377
复制相似问题