StoreFront

Entra ID 通过 OIDC 进行身份验证并单点登录到 VDA

本文介绍了如何配置 StoreFront 和 NetScaler ADC,以允许用户通过 OIDC 使用 Entra ID 进行身份验证,然后单点登录到已加入 Entra 的 VDA。

重要提示:

Entra ID 通过 OIDC 进行身份验证并单点登录到 VDA 目前处于预览阶段。此功能不提供支持,并且尚不建议在生产环境中使用。

先决条件

  • NetScaler 应用交付控制器
  • StoreFront 2507 长期服务版本 累积更新 1 或更高版本
  • 现代用户体验
  • Microsoft Entra ID 以及具有以下权限之一的帐户:
    • 云应用程序管理员
    • 应用程序管理员
    • 全局管理员
  • 带有连接器的 DaaS 订阅。CVAD 不提供此功能。
  • 已发布的桌面和/或应用程序
  • 对于从 Web 浏览器启动到 Citrix Workspace 应用程序的情况,为了启用对 VDA 的 SSO,需要Citrix Web 扩展

已知问题和限制

  • 在启用 Entra ID 身份验证的商店上启用联合身份验证服务不受支持,并可能导致启动失败。
  • 如果一个应用商店包含 Citrix Virtual Apps and Desktops 站点,并且用户通过 OIDC 经由 Entra ID 进行身份验证,则 StoreFront 不会枚举该站点的任何资源。[WSP-30880]
  • 仅在使用基于 OIDC 的身份验证时才支持 Entra ID 对 VDA 的 SSO。SAML 不支持此功能。
  • 当用户属于许多 Entra 组时,StoreFront 会占用大量 RAM。[WSP-29276]

使用 OIDC 进行 Entra ID 身份验证

本节介绍如何配置 NetScaler 和 StoreFront,以便用户可以使用 Entra ID 进行身份验证。在此配置中,用户可以拥有混合身份,也可以拥有不带 Active Directory 帐户的纯 Entra 身份。

创建 微软 Azure Entra ID 应用程序

Microsoft Entra ID 中的应用程序注册定义了您的应用程序,以便 Entra ID 能够识别它(在本例中为 NetScaler OIDC)。此注册还管理应用程序的身份验证和授权请求。由于 OAuth 需要受信任的身份提供程序 (IdP) 来验证用户身份并颁发令牌,因此注册您的应用程序会告知 Entra ID:“此应用程序使用您作为其 OAuth 流的 IdP。”

  1. 登录用于 NetScaler 或 StoreFront 身份验证的 易创身份 租户的 Azure 门户。
  2. 转到 Microsoft Entra ID 资源 > 管理 > 应用程序注册,然后选择新建注册
  3. 命名应用程序,例如 网思乐 StoreFront 身份验证。
  4. 支持的帐户类型下,选择仅此组织目录中的帐户
  5. 重定向 URI 下,选择Web作为要创建的应用程序类型。输入发送访问令牌的 URI。使用 <NetScaler Virtual Server URL>/oauth/login 格式,例如 https://netscalerentra.customer.com/oauth/login

    阿祖尔身份

创建客户端密钥

要创建客户端密钥,请执行以下操作:

  1. 注册应用程序后,转到 管理 > 证书和密钥
  2. 选择 客户端密钥,然后选择 新建客户端密钥。 您的应用程序使用这些凭据与 IdP 安全通信并请求令牌。
  3. 提供密钥的描述和持续时间。
  4. 创建密钥后,请记录密钥值,因为您稍后在设置过程中需要它,并且它仅在此创建阶段可见。

阿祖尔 网思乐

配置应用程序的访问权限

要配置应用程序权限,请执行以下操作:

  1. 转到 管理 > 应用注册,然后选择您的应用程序。
  2. 选择 管理 > API 权限
  3. User.Read 权限已默认添加。
  4. 添加 openid个人资料
  5. 选择 授予 <租户名称> 的管理员同意 并接受。

Microsoft Entra ID 中 API 权限中的“授予管理员同意”表示管理员代表组织中的所有用户批准应用程序使用请求的权限访问特定资源或 API。

Azure 授予权限

配置 Citrix DaaS 服务以启用 XML 信任功能

默认情况下,Citrix DaaS 使用用户的 Active Directory 凭据对请求进行身份验证。使用 Entra ID 身份验证时,StoreFront 不具备凭据。因此,您必须配置 DaaS 以信任 StoreFront,而无需使用身份验证。强烈建议您启用安全密钥以提供服务级别身份验证。

  1. 登录 Citrix Cloud,然后导航到 DaaS 控制台。
  2. 转到“设置”。
  3. 启用“XML 信任”。

    Azure 授予权限

  4. (可选步骤)为了增强安全性,您可以在 DaaS 和 StoreFront 之间启用安全密钥。有关详细信息,请参阅 Citrix DaaS™ 文档中的管理安全密钥

配置 NetScaler 身份验证配置文件

本节介绍如何配置可绑定到网关 VPN 虚拟服务器的 NetScaler 身份验证配置文件。此配置告知 ADC 如何将用户重定向到外部 OAuth IdP(例如 Microsoft Entra ID)进行登录,以及如何处理身份验证后收到的 OAuth 令牌。它指定了端点、客户端凭据、范围以及 ADC 如何从令牌中提取用户信息。

您需要前面步骤中的客户端密钥和 Microsoft Entra ID 身份验证端点。您可以通过转到 Azure 门户中的“应用注册概述”并单击“终结点”选项卡来查找身份验证终结点。

创建身份验证虚拟服务器

身份验证虚拟服务器处理用户身份验证。

add authentication vserver EntraId_Authentication_VirtualServer SSL 0.0.0.0 443 \
  -state ENABLED \
  -authentication ON \
  -td 0 -appflowLog ENABLED \
  -noDefaultBindings NO
bind ssl vserver EntraId_Authentication_VirtualServer \
  -certkeyName <Certificate Key Name>
<!--NeedCopy-->

创建 OAuth 策略和操作

OAuth 操作指定 NetScaler ADC 如何与 OAuth IdP(例如 Microsoft Entra ID)交互。此操作允许 Citrix Gateway 将用户重定向到 IdP 进行登录并处理返回的 OAuth 令牌。它将 userNameField 设置为 oid,这会导致网关在向 StoreFront 进行身份验证时将 OID 作为用户名传递。StoreFront 验证 OID 是否与从查找 Entra ID 访问令牌获得的信息匹配,否则身份验证将失败。

您需要前述步骤中的客户端 ID 和客户端密钥。

add authentication OAuthAction EntraId_Oauth_Server \
  -authorizationEndpoint "https://login.microsoftonline.com/<TenantId>/oauth2/v2.0/authorize\?prompt=login" \
  -tokenEndpoint "https://login.microsoftonline.com/<TenantId>/oauth2/v2.0/token" \
  -clientID <ClientId> \
  -clientSecret <ClientSecret> \
  -Attribute1 email \
  -Attribute2 family_name \
  -Attribute3 given_name \
  -Attribute4 upn \
  -CertEndpoint "https://login.microsoftonline.com/<TenantId>/discovery/v2.0/keys" \
  -userNameField oid \
  -allowedAlgorithms HS256 RS256 RS512 \
  -PKCE ENABLED \
  -tokenEndpointAuthMethod client_secret_post \
  -OAuthType GENERIC \
  -grantType CODE \
  -refreshInterval 1440
add authentication Policy EntraId_Authentication_Policy \
  -rule true \
  -action EntraId_Oauth_Server
<!--NeedCopy-->

为了让用户在尝试通过 NetScaler 访问 StoreFront 时强制重新进行身份验证,authorizationEndpoint 包含查询字符串参数 prompt=login

将身份验证策略绑定到虚拟服务器

bind authentication vserver EntraId_Authentication_VirtualServer \
  -policy EntraId_Authentication_Policy \
  -priority 100 \
  -gotoPriorityExpression END
<!--NeedCopy-->

创建身份验证配置文件

add authentication authnProfile EntraId_Auth_Profile \
  -authnVsName EntraId_Authentication_VirtualServer \
  -AuthenticationLevel 0
<!--NeedCopy-->

创建 VPN 虚拟服务器并绑定身份验证配置文件

使用前述步骤中创建的身份验证配置文件,完成 将 NetScaler Gateway 与 StoreFront 集成 中的步骤 1、2 和 4。

或者,如果您已有合适的 Citrix Gateway,则可以将新的身份验证配置文件绑定到它。运行此命令将替换现有的身份验证配置文件。

set vpn vserver <StoreFront ICA Proxy vServer> \
  -authentication ON \
  -authnProfile EntraId_Auth_Profile
<!--NeedCopy-->

用于 StoreFront 单点登录的 Entra ID 令牌注入配置

Citrix Gateway 对用户进行身份验证后,必须将足够的信息传递给 StoreFront,以便 StoreFront 能够验证用户是否已通过身份验证并查找组成员身份。默认情况下,Citrix Gateway 仅发送 Active Directory 用户名和密码。对于 Entra ID 身份验证,它必须传递 Entra ID 访问令牌,以便 StoreFront 可以使用 Microsoft Graph API 查找用户信息。为此,您必须添加一个重写策略,将 Entra ID 令牌添加到它向 StoreFront 验证用户时发出的调用中。如果重写 Entra ID 访问令牌策略未生效,则登录将失败。如果重写策略功能默认未启用,则必须先启用它。

enable ns feature Rewrite
add rewrite action EntraId_Oauth_Insert_AccessToken_Header insert_http_header X-Citrix-OIDC-Access-Token "AAA.USER.ATTRIBUTE(\"accesstoken\")" \
  -comment "A rewrite policy to add the OAUTH access_token to subsequent user authentication requests"
add rewrite policy EntraId_Oauth_Insert_AccessToken_Policy "HTTP.REQ.URL.TO_LOWER.ENDSWITH(\"gatewayauth/login\") || HTTP.REQ.URL.TO_LOWER.ENDSWITH(\"citrixagbasic/authenticate\")" EntraId_Oauth_Insert_AccessToken_Header \
  -comment "A rewrite policy to add the OAUTH access_token to subsequent user authentication requests"
bind vpn vserver <StoreFront ICA Proxy vServer> \
  -policy EntraId_Oauth_Insert_AccessToken_Policy \
  -priority 100 \
  -gotoPriorityExpression END \
  -type REQUEST
<!--NeedCopy-->

在 StoreFront 中配置 思杰网关

  1. 在 StoreFront 上添加 思杰网关实例

  2. 配置 思杰网关

    • 将登录类型设置为 Domain

    • 指定一个有效的回调 URL。StoreFront 与 Entra ID 身份验证需要此项。

  3. 为聚合 Citrix DaaS 资源的 Store 配置网关以进行远程访问

  4. 从 NetScaler Gateway 启用并配置 Entra ID 身份验证。运行以下 PowerShell,将租户 ID 替换为您的 Entra ID 租户中的 ID,并将 /Citrix/EntraStore 替换为存储路径。

  $store = Get-STFStoreService /Citrix/EntraStore
  $authenticationService = Get-STFAuthenticationService -Store $store
  Set-STFEntraIdSettings -AuthenticationService $authenticationService -TenantId "<Your tenant id>" -Enabled $true
  <!--NeedCopy-->

配置 Entra ID 单点登录到 VDA

在您配置 StoreFront 和 Citrix Gateway 以使用 Entra ID 验证用户后,您可以启用 Entra ID SSO 到 VDA,而无需 FAS。仅在完成 DaaS 配置后才启用此功能。有关详细信息,请参阅 Microsoft Entra 单点登录。这需要对 StoreFront 和 NetScaler ADC 进行以下额外配置。

配置 NetScaler 应用交付控制器内容切换

通常,所有对 StoreFront 的请求都通过网关 VServer,因此需要身份验证。当用户启动已加入 Entra ID 的 VDA 时,Citrix Workspace 应用程序必须再次向 Azure 进行身份验证(如果 Entra ID 会话仍然有效,则为 SSO)并检索访问令牌。作为此流程的一部分,StoreFront 会生成一个令牌,该令牌必须由在 Citrix Cloud 中运行的服务进行验证。此服务必须能够回调 StoreFront 端点 /Citrix/<StoreWeb>/Tickets/RedeemStoreTicket 以验证令牌。由于此服务无法访问 NetScaler 会话,因此有必要绕过 VPN 虚拟服务来处理兑换票证的调用。为此,您可以使用内容切换器。

显示使用内容切换器的请求流的图表

/Citrix/<StoreWeb>/Tickets/RedeemStoreTicket 的调用被定向到一个负载均衡器,该负载均衡器将请求转发到 StoreFront,绕过网关。请注意,需要负载均衡器,因为内容切换器无法配置为直接将流量定向到 URL,并且需要一个虚拟服务器作为目标。负载均衡器不执行任何负载均衡,仅将流量转发到 StoreFront。如果您在同一台计算机上已有合适的 StoreFront 负载均衡器,则可以使用它来代替。

所有其他调用都定向到网关的 VPN 虚拟服务器。

创建负载均衡器以从内容切换器直通到 StoreFront

如果您已经有一个负载均衡器虚拟服务器位于您的 StoreFront 服务器组之前,并且与网关在同一台计算机上运行,则可以跳过此步骤,并配置内容切换器以将流量直接发送到该虚拟服务器。否则,您必须创建一个负载均衡器以将流量直通到 StoreFront 服务器。这是因为内容切换器操作必须引用一个虚拟服务器。

根据 StoreFront 是配置为 HTTPS(推荐)还是 HTTP,步骤略有不同。

StoreFront 已配置为使用 HTTPS 协议进行访问

使用 StoreFront 的 IP 地址创建表示 StoreFront 的服务 stf_srv,并将其绑定到没有持久性的 SSL 负载均衡器。

add service stf_srv <StoreFront Ip Address> SSL 443
add lb vserver lb_vs SSL <lb_vs Ip Address> 443 -persistenceType NONE -cltTimeout 180
bind lb vserver lb_vs stf_srv
<!--NeedCopy-->
StoreFront 服务已配置为使用超文本传输协议

使用 StoreFront 的 FQDN 创建表示 StoreFront 的服务 stf_srv,并将其绑定到没有持久性的 HTTP 负载均衡器。

add server storefront1 <storefront fqdn>
add service stf_srv storefront1 HTTP 80
add lb vserver lb_vs HTTP 0.0.0.0 0 -persistenceType NONE -cltTimeout 180
bind lb vserver lb_vs stf_srv
<!--NeedCopy-->

创建 SSL 内容切换虚拟服务器

创建 SSL 内容切换虚拟服务器以处理客户端请求。此内容切换虚拟服务器侦听端口 443 上的 HTTPS 流量,并将请求路由到网关 VPN 虚拟服务器,或通过负载均衡器传递到 StoreFront。

默认情况下,内容切换处于禁用状态,因此如果您之前未启用,则必须启用它。

enable feature CS
add cs vserver cs_vs SSL <cs_vs Ip Address> 443 -cltTimeout 180 -persistenceType NONE
bind ssl vserver cs_vs -certkeyName <Certificate Name>
<!--NeedCopy-->

创建用于票证兑换的内容切换策略

创建内容切换策略,用于基于包含 StoreFront 票证兑换路径的 URL 进行负载均衡。

当 URL 包含 /Citrix/<StoreWeb>/Tickets/RedeemStoreTicket 时,此策略会匹配请求,并将它们路由到负载均衡器,而无需通过 VPN 虚拟服务器。

StoreEntraWeb 替换为 StoreFront 虚拟服务器 Web 策略中的 StoreFront 网站名称。您可以使用在前面步骤中创建的负载均衡器 lb_vs,也可以使用现有负载均衡器虚拟服务器作为 StoreFront 服务器的前端。

add cs action cs_lb_vs -targetLBVserver lb_vs
add cs policy cs_lb_vs_pol -rule "HTTP.REQ.URL.CONTAINS(\"/Citrix/<StoreWeb>/Tickets/RedeemStoreTicket\")" -action cs_lb_vs
bind cs vserver cs_vs -policyName cs_lb_vs_pol -priority 100
<!--NeedCopy-->

创建用于所有其他流量的内容切换策略

创建通用内容切换策略,以通过 VPN 虚拟服务器发送所有其他 StoreFront 流量进行身份验证。

add cs action cs_vpn_vs -targetVserver <VPN vServer>
add cs policy cs_vpn_pol -rule TRUE -action cs_vpn_vs
bind cs vserver cs_vs -policyName cs_vpn_pol -priority 110
<!--NeedCopy-->

配置 VDA 的 Entra ID 身份验证单点登录

单点登录使用户能够在登录 Citrix Gateway 时进行一次身份验证,然后访问其虚拟桌面和应用程序,而无需重新向 VDA 输入其凭据。

$store = Get-STFStoreService /Citrix/EntraStore
Set-STFStoreLaunchOptions -StoreService $store -EntraIdSsoEnabled $true
<!--NeedCopy-->

启用或禁用 Entra ID SSO 的注意事项

  1. 仅在完成 Microsoft Entra 单点登录 中描述的所有配置后,才启用 Entra ID 单点登录。否则,单点登录将失败,用户可能会遇到启动延迟或错误。
Entra ID 通过 OIDC 进行身份验证并单点登录到 VDA