StoreFront

通过 OIDC 进行 Entra ID 身份验证以及对 VDA 的单点登录

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

重要提示:

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

先决条件

  • NetScaler ADC
  • StoreFront 2511 或更高版本
  • Microsoft Entra ID 和具有以下权限之一的帐户:
    • 云应用程序管理员
    • 应用程序管理员
    • 全局管理员
  • 具有连接器的 DaaS 订阅。此功能不适用于 CVAD。
  • 已发布的桌面和/或应用程序
  • 要从 Web 浏览器启动到 Citrix Workspace 应用程序以启用对 VDA 的 SSO,请使用 Citrix Web 扩展

使用 OIDC 进行 Entra ID 身份验证

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

创建 Microsoft Azure Entra ID 应用程序

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

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

    Azure ID

创建客户端密钥

要创建客户端密钥:

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

Azure NetScaler

配置应用程序权限

要配置应用程序权限:

  1. 转至管理 > 应用程序注册,然后选择您的应用程序。
  2. 选择管理 > API 权限
  3. 默认情况下已添加 User.Read 权限。
  4. 添加 openidprofile
  5. 选择为 <租户名称> 授予管理员同意并接受。

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

Azure grant permission

配置 Citrix DaaS 以启用 XML 信任

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

  1. 登录到 Citrix Cloud 并转至 DaaS 控制台。
  2. 转至设置
  3. 打开 XML 信任

    Azure grant permission

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

配置 NetScaler 身份验证配置文件

本部分介绍如何配置 NetScaler 身份验证配置文件,您可以将其绑定到网关 VPN 虚拟服务器。此配置告知 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
<!--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-->

authorizationEndpoint 包含查询字符串参数 prompt=login,以便用户在尝试通过 NetScaler 访问 StoreFront 时被迫重新进行身份验证。

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

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-->

用于 SSO 到 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 中配置 Citrix Gateway

  1. 在 StoreFront 上添加 NetScaler Gateway 实例

  2. 配置 Citrix Gateway

    • 将登录类型设置为

    • 指定有效的回调 URL。这对于使用 StoreFront 进行 Entra ID 身份验证是必需的。

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

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

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

配置 Entra ID SSO 到 VDA

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

配置 NetScaler ADC 内容切换

通常,所有对 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

使用其 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 配置为 HTTP

使用其 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/StoreEntraWeb/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/StoreEntraWeb/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. 仅当您配置 Azure Entra ID 企业应用程序并使用租户更新 StoreFront 时才启用单点登录。如果您为当前使用 Entra ID 和 SAML 但没有这些设置的 Store 启用此设置,则如果您正在使用 FAS,它可能会破坏现有的单点登录。

  2. 如果您为当前使用 Entra ID 和 SAML 但 VDA 当前没有 SSO 的现有 Store 启用此设置,则启动可能会延迟,或者您可能会看到与 Entra ID 身份验证设置相关的错误。

通过 OIDC 进行 Entra ID 身份验证以及对 VDA 的单点登录