设置 Microsoft Entra ID (Azure AD) 单点登录
OpenID Connect (OIDC) 是位于 OAuth 2.0 协议 之上的简单身份层。它允许客户端根据身份提供商执行的身份认证来验证最终用户的身份,并以可互操作和类似 REST 的方式获取有关最终用户的基本个人资料信息。通过 APISIX 和 Microsoft Entra ID(前身为 Azure AD),你可以实施基于 OIDC 的身份认证流程来保护你的 API 并启用单点登录 (SSO)。
Microsoft Entra ID 是微软基于云的身份和访问管理服务。它允许组织安全地管理和验证用户和设备,确保合适的人员拥有对公司资源的适当访问权限。Microsoft Entra ID 提供单点登录 (SSO)、多因素 身份认证 (MFA) 以及与各种第三方应用程序的集成等功能。
本指南将向你展示如何使用 用户凭证进行身份认证 和 客户端凭证进行身份认证 将 APISIX 与 Microsoft Entra ID 集成。
前置条件
- 安装 Docker。
- 安装 cURL 以向服务发送请求进行验证。
- 按照 快速入门教程 在 Docker 或 Kubernetes 中启动一个新的 APISIX 实例。
- 创建一个具有有效订阅的 Azure 帐户。
在 Azure 中注册应用程序
登录到 Azure 门户,转到 App registrations 服务并注册一个新应用程序。

注册应用后,单击 Authentication 选项卡,然后单击 Add a platform。选择 Web 应用程序类型,并将新的重定向 URI http://localhost:9080/anything/callback 添加到 Web 页面下的 Redirect URIs 列表中。这是应用程序在使用 Microsoft Entra ID 成功进行身份认证后将用户重定向到的地址。单击 Configure 保存更改。

要将 Microsoft Entra ID 配置为使用 v2.0 令牌,请编辑你的应用程序 Manifest,并将 accessTokenAcceptedVersion 设置为 2。

在 Certificates & Secrets 选项卡中,创建一个客户端 secret 并将该值保存到安全位置,以便稍后用于 APISIX OIDC 插件配置。你只能查看该 secret 一次。

导航回 Overview 选项卡,找到 Directory (tenant) ID 和 Application (client) ID。将它们连同客户端 secret 一起保存到环境变量:
# replace with your values
export TENANT_ID=dcbd8da3-e0b3-486c-9212-08a199dc3451
export CLIENT_ID=e0951842-d546-4c63-9e9e-d33a527673de
export CLIENT_SECRET=wSY8Q~x4z2Tn6Rq5lA4NTtZ6GLBMGvZF_R2LEcPx
配置 APISIX
在本节中,你将创建一个带有 OIDC 的路由,该路由将客户端请求转发到 httpbin.org,这是一个公共 HTTP 请求和响应服务。
httpbin.org 的路由 /anything/{anything} 以 JSON 类型返回请求数据中传递的任何内容,例如方法、参数和标头。
启用 OIDC 插件
创建路由并启用 openid-connect 插件:
- Admin API
- ADC
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT --data-binary @- <<EOF
{
"id": "auth-with-oidc",
"uri":"/anything/*",
"plugins": {
"openid-connect": {
"client_id": "$CLIENT_ID",
"client_secret": "$CLIENT_SECRET",
"discovery": "https://login.microsoftonline.com/$TENANT_ID/v2.0/.well-known/openid-configuration",
"scope": "openid",
"redirect_uri": "http://localhost:9080/anything/callback",
"bearer_only": false,
"session": {
"secret": "f86cf31663a9c9fa0a28c2cc78badef1"
}
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"httpbin.org:80":1
}
}
}
EOF