集成 Microsoft Entra ID
本指南通过 SAML 单点登录(SSO)把 AISIX Enterprise 或 AISIX Cloud 组织与 Microsoft Entra ID 连接起来。完成后,分配到 Entra ID 企业应用的人员可以用其 Entra ID 账号登录控制台,并由你为其分配的 Entra ID 应用角色决定其在组织中的角色。
以下步骤按管理员实际操作的顺序排列,在 Microsoft Entra 管理中心与控制台之间来回切换。配置完成后 SSO 的行为(包括成员加入、角色映射、强制单点登录和会话)请参见单点登录(SAML)。
前提条件
开始之前,请确认:
- 你拥有组织的 所有者 角色。只有所有者可以修改 SSO 连接。
- 你在 Microsoft Entra ID 中拥有可创建和配置企业应用的角色,例如 Cloud Application Administrator 或 Application Administrator。
- 浏览器能通过 HTTPS 访问 AISIX Enterprise 或 AISIX Cloud 控制面的公开 URL。在 AISIX Enterprise 中,该地址即
AISIX_CLOUD_PUBLIC_BASE_URL,在 Helm Chart 中为api.publicBaseURL。参见运行时 URL。
Entra ID 只对 localhost 接受 http:// 回复 URL,而 My Apps 磁贴完全无法打开 http:// 登录 URL,因此纯 HTTP 的控制面只适合本地测试。
创建企业应用
为控制面创建一个非库应用:
- 登录 Microsoft Entra 管理中心,进入 Entra ID > Enterprise apps > All applications。
- 选择 New application,然后选择 Create your own application。
- 输入名称(例如
AISIX),选择 Integrate any other application you don't find in the gallery (Non-gallery),然后选择 Create。 - 在新应用的 Manage 下选择 Single sign-on,再选择 SAML。
随后会打开 Set up Single Sign-On with SAML 页面,后续步骤都在这个页面上进行。
复制服务提供方信息
在控制台 中打开 设置,选择 身份认证 标签页,找到 单点登录(SAML) 卡片。其中 服务提供商 部分列出三项值,每项都带有 复制 按钮:
- 实体 ID(标识符):
<public-base-url>/api/auth/sso/saml/<org-id>/metadata - 断言消费服务 URL(回复 URL):
<public-base-url>/api/auth/sso/saml/<org-id>/acs - 登录 URL:
<public-base-url>/login?sso=<org-slug>
在保存任何连接之前,卡片上就已显示这些值,因此可以先在 Entra ID 中完成应用登记。这些值的生成方式参见服务提供方信息。
填写基本 SAML 配置
在 Entra ID 的 Set up Single Sign-On with SAML 页面上,在 Basic SAML Configuration 部分选择 Edit,填写 SSO 卡片中的值:
| Entra ID 字段 | SSO 卡片中的值 |
|---|---|
| Identifier (Entity ID) | 实体 ID(标识符) |
| Reply URL (Assertion Consumer Service URL) | 断言消费服务 URL(回复 URL) |
| Sign on URL | 登录 URL |
Relay State 和登出 URL 保持为空,然后选择 Save。
请务必填写 Sign on URL。控制面只接受由它自己发起 的登录。填写登录 URL 后,My Apps 中的应用磁贴会打开控制台登录页面,由该页面发起登录。如果不填写,点击磁贴会让 Entra ID 发送一个控制面并未请求的响应,控制面会以 SSO_UNSOLICITED_RESPONSE 拒绝它。
检查属性和声明
控制面从 SAML 断言中读取三项值:
- 名称标识符(NameID),用于识别此人。首次登录之后,控制面只按它识别此人,因此它不能随此人的邮箱地址或用户名变化。参见身份关联。
- 邮箱地址,取自
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress声明。该声明不存在时,如果 NameID 是邮箱格式,控制面会改用它。在控制面信任身份提供方断言该地址的情况下,首次登录按这个地址匹配账号。参见首次登录。 - 显示名称,取自
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name声明;该声明不存在时,拼接givenname和surname声明。控制面在创建账号时,以及在 AISIX Cloud 中登录接管一个为该地址注册却从未验证邮箱的账号时,用显示名称设置账号名称。已验证过邮箱的账号保留原名称,之后的登录也不会修改它。
在 Attributes & Claims 部分,确认应用带有以下默认声明:
| 声明 | 源属性 |
|---|---|
| Unique User Identifier (Name ID) | user.userprincipalname |
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress | user.mail |
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name | user.userprincipalname |
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname | user.givenname |
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname | user.surname |
如果声明列表为空,请先添加这些声明再继续。通过 Microsoft Graph、PowerShell 或基础设施即代码工具(而不是在管理中心中)创建的应用,常常没有任何声明配置。此时 Entra ID 会把一个不透明的成对标识符作为 NameID 发送,并且不发送 emailaddress 声明,控制面因此收不到邮箱地址。
然后把 NameID 改为永不变化的用户对象 ID:
- 选择 Unique User Identifier (Name ID) 声明。
- 将 Name identifier format 设为 Persistent,Source attribute 设为
user.objectid。 - 选择 Save。
默认的 NameID,即用户主体名称(UPN),也可以使用,但用户改名时 UPN 会变化。改名后的用户会被拒绝并返回 SSO_ACCOUNT_ALREADY_LINKED,直到被移出组织再重新加入。请在成员开始登录之前完成这项修改:之后再改 NameID,对所有已经登录过的人都会产生同样的影响。参见之后更改 NameID。
使用对象 ID 作为 NameID 时,邮箱地址只来自 emailaddress 声明,即 user.mail;用户没有 mail 值时,Entra ID 不会发送该声明。这样的用户仍可登录,但控制面收不到其邮箱地址,因此首次登录总会进入关联页面,且只能关联已有账号。如果想改用 UPN 作为邮箱地址,请把 SSO 卡片上的 邮箱属性 设为携带 UPN 的 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name。
如果希望控制台显示人员姓名而不是 UPN,请把 name 声明的源属性改为 user.displayname。
不要为该应用开启 Token 加密,控制面不接受加密的断言。Entra ID 使用 RSA-SHA256 对断言签名,不对响应签名,控制面接受这种方式。
如果同时通过 SCIM 从 Entra ID 预配用户,那么地址在组织已验证域名以外的用户,会在以等于 SCIM 所发送 externalId 的 NameID 关联 SSO 时加入。请把同一个 Entra ID 属性同时映射到两者,例如 NameID 为 user.objectid 时,在预配的属性映射中把 objectId 映射到 externalId。参见等待加入的成员。
定义应用角色
应用角色用来让 Entra ID 告诉控制面每个人应具有的角色。请为每个不同于连接默认角色的组织角色定义一个应用角色。以管理员的应用角色为例:
- 在 Microsoft Entra 管理中心进入 Entra ID > App registrations,选择 All applications,然后选择你创建的应 用。它与企业应用同名。
- 在 Manage 下选择 App roles,然后选择 Create app role。
- 输入 Display name(例如
AISIX Admin),将 Allowed member types 设为 Users/Groups,输入 Value(例如AISIX.Admin),并填写 Description。 - 保持勾选 Do you want to enable this app role?,然后选择 Apply。
Value 就是 Entra ID 在 http://schemas.microsoft.com/ws/2008/06/identity/claims/role 声明中发送的值,也是角色映射规则比较的值,区分大小写。
没有应用角色、或其应用角色没有被任何规则命中的人,会获得连接的默认角色,无需为他们定义应用角色。
使用组代替应用角色
推荐使用应用角色,但规则也可以读取 Entra ID 组。在 Attributes & Claims 中选择 Add a group claim。Entra ID 随后会发送 http://schemas.microsoft.com/ws/2008/06/identity/claims/groups 声明,其值默认是组的对象 ID,因此规则的值应填组的对象 ID,而不是组名。
Entra ID 在 SAML 断言中最多发送 150 个组,用户所属组超过该数量时会完全省略该声明。选择 Groups assigned to the application 可以只发送分配给该应用的组,使声明保持精简。