编程语言
首页 > 编程语言> > 用于SSO的PHP ADFS(通过OAuth) – 如何设置ADFS?

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

作者:互联网

我试图在项目上使用ADFS进行SSO.该项目是在PHP上,我试图使用OAuth.

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

非常感谢.

解决方法:

I see that the question is quite old. But in case if other people will
get here, I have some answer which should be good for March 2019.

让我首先概述一下.

SSO

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

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定义了许多身份验证流程.
最优选的是:

> PKCE授权代码流程(单页面应用程序,本机应用程序)

如果您使用的是oidc-client-js,则应使用response_type = code来使用PKCE.

Public native app clients MUST implement the Proof Key for Code Exchange (PKCE RFC7636])

07005

Note: although PKCE so far was recommended as a mechanism to protect native apps, this advice applies to all kinds of OAuth clients, including web applications.

07006

>被认为不推荐的隐式流程:

Clients SHOULD NOT use the implicit grant and any other response type causing the authorization server to issue an access token in the authorization response

07007

>客户端凭据流.用于服务到服务的通信.

如何配置ADFS?

您可以在Microsoft Docs: Native client with ADFS找到非常详细的文档,其中包含“Native app scenario”的插图.

如果您不使用ADFS,则可以使用playground中的PKCE流程设置.

JavaScript前端

Never store client secrets in public applications like JS frontend or mobile apps. It’s not applicable to PKCE flow but just in case.

如果您有一个现代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签名
>检查发行人是否为合适的发行人(身份提供者)
>检查aud(观众)是否有正确的客户ID
>检查exp(到期时间戳)
>检查索赔

标签:php,oauth-2-0,single-sign-on,adfs3-0
来源: https://codeday.me/bug/20190711/1429582.html