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

2024-03-25

我正在尝试使用ADFS for SSO在一个项目上。该项目正在进行中PHP我正在尝试使用OAuth为了这。

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

多谢。


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

让我从总体概述开始。

SSO

SSO https://en.wikipedia.org/wiki/Single_sign-on可以通过个人 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 连接 https://openid.net/connect/faq/它在之上工作OAuth 2.0 https://oauth.net/2/协议。

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 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 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 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-09

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

如何配置ADFS?

您可以在以下位置找到非常详细的文档,其中包含“本机应用程序场景”的插图Microsoft Docs:使用 ADFS 的本机客户端 https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/development/native-client-with-ad-fs.

如果您不使用 ADFS,您可以使用 PKCE 流设置操场 https://www.oauth.com/playground/authorization-code-with-pkce.html.

JavaScript 前端

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

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

oidc-客户端-js https://github.com/IdentityModel/oidc-client-js/可以帮助你。确保code_verifier与令牌请求一起发送(这意味着您正在使用更安全的 PKCE 流程)。

PHP后端

在 PHP 方面,您需要验证访问令牌。您可以根据以下内容自行实现工作流程那篇文章 https://auth0.com/docs/api-auth/tutorials/authorization-code-grant-pkce。但最好使用 OpenID 认证库,您可以在此页面上找到它(不仅适用于 PHP):https://openid.net/developers/certified/ https://openid.net/developers/certified/

所以,对于 PHP 来说只有一种:phpOIDC https://bitbucket.org/PEOFIAMP/phpoidc.

验证

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

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

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

  • 使用公钥验证 JWT 签名
  • Check issuer对于适当的发行者(身份提供商)
  • Check aud(观众)获取正确的客户端 ID
  • Check exp(过期时间戳)
  • 检查索赔
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • 将 XML 数据提取到 php [重复]

    这个问题在这里已经有答案了 我正在尝试从 XML 文件中提取数据 http freegeoip net xml google com http freegeoip net xml google com 您可以看到该文件的内容类似于
  • PHP 数组键字符串不带引号

    我正在将文件移动到服务器 并使用 GET mode 等变量 而 mode 中不带 单引号 它在本地运行良好 但在服务器上我收到通知 我该如何克服这个问题 这是我的 phpinfo 文件phpinfo http solutiq com php
  • 无法使用 PHP ftp_connect() 连接 FTP 服务器

    我试图使用 PHP 的 ftp connect 函数连接 ftp 服务器 如下所示 但它返回这个错误 警告 ftp connect function ftp connect php network getaddresses getaddri
  • 同一页面中多个表单上的 Google 隐形 ReCaptcha - PHP

    我正在我的 php 网站上关注这个 Invisible ReCaptcha 文档 http www pinnacleinternet com installing invisible recaptcha http www pinnaclei
  • Laravel:运行队列:在 Windows Azure Web App 上连续监听

    我觉得问这个问题有点傻 但我似乎无法在互联网上找到这个问题的答案 经过几个小时的搜索后 我发现在 Linux 服务器上 您使用 Supervisor 在您的网站上连续运行 php artisanqueue listen 无论有或没有守护进程
  • 如何在 Yii 中设置 returnUrl 值

    我正在使用 Yii 我遇到的问题是Yii app gt user gt returnUrl 它总是让我回到index php page 由于我不知道用户从哪个页面访问了当前页面 如何将其值设置为请求当前页面的页面 您可以使用Yii app
  • MySQL 连接不工作:2002 没有这样的文件或目录

    我正在尝试设置 WordPress 我已经运行了 Apache 和 MySQL 并且帐户和数据库都已设置 我尝试建立一个简单的连接 我总是得到这个 错误 2002 没有这样的文件或 目录 它正在谈论什么文件或目录 我使用的是 OS X Sn
  • 数组和关联数组合并

    如何实现第三个数组 合并Array1和Array2 在 PHP 中做到这一点的最佳方法是什么 非常感谢 Array2 具有类似索引 键 即 Array1 中 id 的关联值 Array1 Array 0 gt Array id gt 56
  • 在 PHP 5 中使用 Schematron 验证 XML

    我在验证 XML 时遇到问题图解器 http en wikipedia org wiki Schematron 在我的代码中 我将 XML 和 XSL 作为 DOMDocument 对象加载 并尝试进行转换 domSche new DOMD
  • Facebook PHP API 登录时抛出异常

    我尝试使用 Facebook Graph API 登录并获取用户信息 我用来获取用户信息的代码以前可以工作 但今天我尝试使用 Facebook 登录 但 Facebook API 抛出此错误 未定义的偏移量 1 home vendor fa
  • PHP mail() 函数发送电子邮件,但需要 10 多分钟才能显示

    因此 我的用户从手机上的 Android 应用程序进行注册 注册成功后 我会触发一封邮件发送到注册的电子邮件地址 其中包含来自我的 PHP 脚本的激活密码 这是我使用的代码行 非常简单 mail to subject message hea
  • 为什么 http://localhost/ 不使用 WAMP 加载任何内容?

    我最近尝试安装 WAMP 但发现没有页面加载 它还有一个橙色的 W 标志 如果这有什么意义的话 它确实说 托盘图标 WAMP服务器已上线尽管 我也做了一些研究 发现 Skype 可能会引起问题 所以我删除了使用端口 80 和 443 作为传
  • 如何从 jquery .load 获取 php 响应

    例如我给出另一个代码 这是我的 some3 php 代码 第一个文件
  • 从字符串中删除第一个和最后一个字符

    我有这个 dataList one two three list explode dataList echo pre print r list echo pre 其输出 gt Array gt 0 gt gt 1 gt one gt 2 g
  • 向 yahoo 和 hotmail 用户发送电子邮件?

    我正在使用 php 和 mysql 每次用户在我的网站上注册时 我都会使用 php mail 发送一封电子邮件进行身份验证 最近我发现 很多Yahoo和Hotmail用户还没有激活他们的帐户 假设 1000 个用户中 只有 200 个被激活
  • 根据产品属性在 Magento 中创建购物车规则

    我在一个类别中有产品 针 有些以 100 支为一包出售 有些以 500 支为一包出售 盒子中的针数被设置为产品属性 我想根据购物车中的针总数应用购物车规则 F x 如果您购买 1000 2000 根针头 无论 500 100 包的组合如何
  • Laravel中with()和compact()有什么区别

    功能有什么区别with and compact 在 Laravel 中这两个例子 示例1 return View make books index gt with booksList booksList 示例2 return View ma
  • Adobe AIR 应用程序能否实现针对 Active Directory 的 SSO 身份验证?

    我对 AIR 应用程序了解不多 但我喜欢目前所看到的内容 所以现在 我想知道这种类型的应用程序在工作中的内联网中是否有意义 在投入时间和精力加强 AIR 开发之前 我想知道 Windows 上的 AIR 应用程序是否可以针对 Active
  • Symfony2 dev环境可以工作,prod环境给出404错误

    我最近在我的机器上成功安装了 Symfony2 我可以访问http localhost app dev php 开发环境 但是 当我尝试访问 prod 环境时 http localhost app php 我在浏览器中收到以下错误消息 哎呀

随机推荐

  • MS Access VBA 代码编辑器字符编码和复制/粘贴

    Access 的 VBA 编辑器中实际使用的编码是什么 我已经寻找具体答案很长一段时间了 但没有运气 我以为它是UTF 8 但我不太确定 我的主要问题是 在 VBA 中编写查询时 有时需要在 Access 的查询编辑器中测试它 然而 当复制
  • 将本地 jar 文件声明为库项目的传递依赖项

    我有一个 Android 应用程序 App1 它依赖于一个库项目 Lib1 该库项目有几个远程依赖项 例如 guava android 支持库等 和两个本地依赖项 它们是存储在 Lib1 libs 中的 JAR 文件 Lib1 的 buil
  • Android - CardView 背景始终为灰色

    我正在尝试以编程方式更改 CardView 颜色 这是我的卡片视图
  • Silverlight - 绑定使用 https 的图像

    我存储了一个图像 可以使用 http 和 https 在浏览器中查看该图像 然而 当我将这些 url 绑定到我的图像源时 我只能看到使用 http 的 URL silverlight 有什么办法支持 https 图像吗 似乎是Silverl
  • FSharp.Data Csv.Load() 失败,仅支持 Web 位置

    我有以下代码 r packages FSharp Data 2 0 9 lib portable net40 sl5 wp8 win8 FSharp Data dll open FSharp Data let trainData CsvFi
  • Go 之旅练习#10:爬虫

    我正在经历 Go Tour 我觉得除了并发之外 我对这门语言有了很好的理解 slide 10 https tour golang org concurrency 10是一个要求读者并行化网络爬虫的练习 并使其不覆盖重复 但我还没有做到这一点
  • Keras:如何将学习率输出到张量板上

    我添加了一个回调来衰减学习率 keras callbacks ReduceLROnPlateau monitor val loss factor 0 5 patience 100 verbose 0 mode auto epsilon 0
  • Sonata 管理仪表板:配置每个实体的操作

    我正在使用SonataAdminBundle作为 Symfony2 v2 0 x 支持的网站管理界面的基础 默认情况下 添加到 SonataAdmin 仪表板的实体具有以下操作 add list 这对于大多数实体来说效果很好 但是该网站有一
  • 如何禁用文本区域的可调整大小属性?

    我想禁用 a 的可调整大小属性textarea 目前 我可以调整大小textarea通过单击右下角textarea并拖动鼠标 我怎样才能禁用这个功能 以下 CSS 规则禁用调整大小行为textarea http www w3 org wik
  • elm:读取文件内容

    有没有办法读取文件elm 我想要一个xml设置文件 我将在其中保留不同的设置并用 elm 读取它 我已经看过这个parser https github com toburger elm xml parser 但它期望xml内容 而不是路径
  • 解决方案构建顺序的保存位置

    我有一个包含多个项目 csproj 和 btproj 的解决方案 我实际上正在运行 BizTalk 2013 R2 因此我在 Visual Studio 2013 下进行开发 我有许多 powershell 脚本来部署我的应用程序 我必须增
  • 查找包含任意坐标列表的 voronoi 区域

    我正在使用一种算法 对于每次迭代 都需要找到一组任意坐标属于 Voronoi 图的哪个区域 即每个坐标位于哪个区域内 我们可以假设所有坐标都属于一个区域 如果这有什么区别的话 我还没有任何可以在 Python 中运行的代码 但伪代码如下所示
  • 将 OS National Grid 名称/代码添加到 R 中的网格

    我希望重新创建完整的地形测量国家网格 如此处所示https upload wikimedia org wikipedia commons f f5 Ordnance Survey National Grid svg https upload
  • 如何将工作表保存到新工作簿?

    我正在尝试将单个工作表保存到新工作簿 VBA 应该创建一个新工作簿 代码正在运行 新工作簿会弹出 其中包含所需的数据 并且 另存为 对话框窗口也会打开 但是当我选择名称并保存文件时 找不到新工作簿保持打开状态 Book1 或无论自动填充什么
  • 如何在Python中的recv之前找出socket中有多少字节?

    我有一个处理数据流的 TCP 它一次需要 4096 个字节 但我需要一种方法在接收之前找出整个套接字的大小 这样我就可以确定在切换套接字之前套接字将被读取多少次 它还会通知这是该套接字的最后一次接收 以便我可以在选择切换到另一个套接字 当它
  • SSL 启用:Windows 7 中的 Tomcat [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当我尝试在 Windows 7 中启用 SSL 编辑 server xml 以启用端口 8443 作为 HTTPS 时 它没有被启用 有时它会显示 连
  • 列出两个日期之间的天数数组

    我想列出两个日期之间的一系列天数 我可以使用下面的代码列出一系列月份 我如何更改它以显示两个日期之间的每一天 require date date from Date parse 2011 05 14 date to Date parse 2
  • 自定义视图引擎中的 ASP.NET MVC 自定义属性

    假设我写了一个自定义属性 public class SpecialActionFilterAttribute System Web Mvc ActionFilterAttribute public override void OnActio
  • 如何将 grep 的输出通过管道传输到 cp?

    我有一个工作grep选择满足特定条件的文件的命令 我怎样才能从grep命令并将其通过管道传输到cp命令 以下尝试都失败了cp end grep r TWL exclude csv cp data lidar tmp ajp2 cp 之后缺少
  • 用于 SSO 的 PHP + ADFS(通过 OAuth) - 如何设置 ADFS?

    我正在尝试使用ADFS for SSO在一个项目上 该项目正在进行中PHP我正在尝试使用OAuth为了这 那么设置 ADFS 以与 OAuth2 配合使用的步骤是什么 我对 ADFS 一无所知 也无法在那里获得有关 OAuth2 设置的任何