高级概念

Citrix Gateway 和 Microsoft Azure 多重身份验证

Citrix Gateway 可通过任何设备和任何浏览器向用户展示所有托管、SaaS、Web、企业和移动应用程序。它使用 nFactor 身份验证根据内部部署 Microsoft AD 对用户进行身份验证,并利用 Microsoft AD FS 进行 Azure 多重身份验证 (MFA)。

Citrix Gateway

Citrix Gateway 为用户提供一个访问点和单点登录 (SSO),访问部署在数据中心和云中的业务应用程序和数据。它以 SaaS 的形式交付到各种设备(笔记本电脑、台式机、瘦客户端、平板电脑和智能手机)。Citrix Gateway 提供整合,有助于减少远程访问基础结构的占用空间,降低成本,并提供易于管理和更好的最终用户体验。Citrix Gateway 帮助 IT 过渡到混合云和 SaaS 环境。

  • 联合身份验证和单点登录

Citrix Gateway 提供联合身份并支持 SAML 2.0、OAuth 和 OpenID,以便在所有应用程序中实现单点登录,无论这些应用程序是 Web、VDI、企业应用程序还是 SaaS 应用程序。

  • 本地用户目录

Citrix Gateway 为 SaaS 应用程序(例如 Office 365 和 Salesforce)提供 SSO,并且将用户目录保留在本地。它可以作为 IdP 或代理来实现 Microsoft Active Directory 联合身份验证服务 (AD FS)。

  • 多重 (nFactor) 身份验证

Citrix Gateway 提供了 nFactor 身份验证机制,并允许对访问网络的用户、访问内容以及访问网络的方式和时间进行精细控制。它支持所有身份验证机制,如 RADIUS、TACACS、NTLM、Diameter、SAML 2.0、OAuth 2.0 和 OpenID 2.0。

  • 上下文访问控制策略

Citrix Gateway 允许根据最终用户设备、用户、用户位置和其他数据的状态对业务应用程序进行精细的访问控制。IT 管理员可以创建、管理和强制执行策略,以便在应用程序环境中安全地访问数据。这些策略可以用于 VDI、Web、移动、企业和 SaaS 应用程序。

  • 可视性和监视

Citrix Application Delivery Management 包括 Gateway Insight,它为通过 Citrix Gateway 访问的所有应用程序提供端到端用户体验的可见性。它为应用程序支持团队提供信息,以解决与身份验证失败有关的问题,包括 EPA 检查失败和单点登录失败。

应用程序

支持的应用

Microsoft Azure MFA

在日益复杂的情况下,人们正在连接到组织资源。人们通常在多个平台上使用智能手机、平板电脑、PC 和笔记本电脑,从公司网络上和公共网络上的组织拥有、个人和公共设备进行连接。在这个始终连接、多设备和多平台的世界中,用户帐户的安全性比以往任何时候都更加重要。跨设备、网络和平台使用的密码,无论其复杂性如何,都不足以确保用户帐户的安全性,尤其是当用户倾向于跨账户重复使用密码时。复杂的网络钓鱼和其他社交工程攻击可能导致用户名和密码在黑暗网络上发布和销售。

两步核查进程的安全在于其分层办法。妥协多个身份验证因素对攻击者来说是一项重大挑战即使攻击者设法了解用户的密码,在没有其他身份验证方法的情况下,它也是无用的。其工作原理是要求使用以下两种或更多种身份验证方法:

  • 您知道的内容(通常为密码)
  • 您拥有的对象(不容易复制的可信设备,例如手机)
  • 您是什么(生物识别)

Azure 多重身份验证有助于保护数据和应用程序的访问。它使用第二种身份验证形式提供了额外的安全层。组织可以使用条件访问来使解决方案满足其特定需求。

Microsoft Azure MFA 部署方法

利用 Azure MFA 作为身份验证的第二个因素有不同的方法。下面将简要介绍这些方法及其优缺点。

Azure MFA 服务器

Microsoft Azure 多重身份验证服务器是原始方法,将被弃用。不应该考虑进行任何新的实施,因为

  • Microsoft 对此方法没有进一步的投资。
  • 没有与基于云的 SSPR 和 Azure MFA 集成。
  • 没有从 MFA 服务器到基于 MFA 云的解决方案的无缝迁移工具。

Azure MFA 网络策略服务器扩展

Azure MFA 的网络策略服务器 (NPS) 扩展是支持的解决方案,它使用 NPS 适配器连接到基于云的 Azure MFA。它可以用作本地 RADIUS 服务器。

  • NPS 适配器 (RADIUS) 将提供 MFA 规则或开/关内部/外部的网络位置。
  • 它与与 SAML 集成方法类似的 Azure AD 条件访问策略不兼容。条件访问策略具有更丰富、更好的用户体验。
  • 用户必须在 MFA 中注册,然后才能使用 NPS 适配器。与 Azure MFA 基于云的访问和条件访问不同,如果用户未注册,则 NPS 扩展将无法对用户进行身份验证,从而生成对帮助台的更多调用。
  • 当 NPS 适配器调用 MFA 时,它会触及用户注册的默认选项。没有向用户提供需要 MFA 并且 MFA 即将推出的任何直观通知。在封闭过程中,用户没有用户界面可以更改 MFA 方法。如果用户没有默认设备,则会失败。用户必须返回自助服务门户并重置默认选项,然后尝试重新连接。

Microsoft AD FS 和 Azure MFA

如果贵组织与 Azure AD 联合,但密码哈希未与 Azure AD 同步,则可以将本地 AD 用于轻型目录访问协议 (LDAP),并将 Azure MFA 作为 AD FS 中继方访问策略的一部分启用 Azure MFA。从 Windows Server 2016 开始,您现在可以配置 Azure MFA 进行主身份验证。

  • Azure MFA 适配器内置到 Windows Server 2016,并且不需要额外的安装。
  • Azure MFA 适配器直接与 Azure AD 集成,不需要本地 Azure MFA 服务器。
  • 如果用户没有注册 MFA,则会在下次登录时引导他们完成该过程。它可以确保减少对服务台的呼叫,并为用户提供更好的流程。
  • 用户会收到一个需要 MFA 并且 MFA 即将推出的直观通知。用户可以在 UI 中的封闭过程中更改网关选项。

Azure AD 和 Azure MFA

如果贵组织正在将密码哈希同步到 Azure AD 中,则可以通过条件访问策略利用 Azure MFA 来挑战用户进行第二因素身份验证。

  • 此方法不需要在本地安装任何额外的安装。
  • 如果用户没有注册 MFA,则在下次登录时将引导他们完成该过程。它可以确保减少对服务台的呼叫,并为用户提供更好的流程。
  • 用户会收到一个需要 MFA 并且 MFA 即将推出的直观通知。用户可以在 UI 中的封闭过程中更改网关选项。

Azure AD 直通身份验证和 Azure MFA

Azure AD 直通身份验证 (PTA) 允许用户使用相同的密码登录本地和基于云的应用程序。当用户使用 Azure AD 登录时,此功能将直接针对本地 Active Directory 验证用户的密码。Azure AD PTA 是 Azure AD 密码哈希同步的替代方案,它为组织提供云身份验证的同样好处。

  • Azure AD PTA 要求在本地安装轻型代理。
  • Azure AD PTA 通过与 Azure AD 条件访问策略(包括 Azure MFA)无缝协作来保护用户帐户。
  • 用户可以在云中完成自助服务密码管理任务。
  • 本地密码永远不会以任何形式存储在云中。
  • 代理程序只能从您的网络内进行出站连接。因此,不需要在外围网络(也称为 DMZ)中安装代理。

目前的情况

具有以下特征的环境需要将 Azure MFA 作为身份验证的第二个因素:

  • 配置了具有 Azure AD 同步的本地 AD。
  • Azure AD 密码哈希同步已禁用。
  • 需要访问 O365 应用程序。
  • 需要访问本地 Citrix Virtual Apps and Desktops。
  • 需要使用现代身份验证方法(SAML、OAuth)访问应用程序。
  • 需要使用旧版身份验证方法访问应用程序。

设计要点

下面是所提出的解决方案的设计要点:

  • 在单个门户中安全地访问托管、SaaS、企业和 Web 应用程序是必需的。
  • 在身份验证过程中,用户只需要输入一次凭据。
  • 必须为所有托管、SaaS、企业和 Web 应用程序提供单点登录。

提议的解决方案

概述

提议的解决方案基于以下组成部分:

  • 本地 Citrix Gateway
  • 本地 Microsoft AD
  • 本地 Microsoft AD FS
  • 作为 AD FS 代理的本地 Citrix ADC
  • Microsoft Azure MFA

Citrix Gateway 正在利用身份验证、授权和审核功能(Citrix ADC AAA)和 nFactor 身份验证机制使用 LDAP 策略对用户进行身份验证,并利用 AD FS Relay 方上的访问策略触发 Azure MFA 验证过程。Azure MFA 验证用户后,AD FS 将生成 SAML 断言(SAML 响应)并将用户重定向回 Citrix Gateway。此时,用户将进行身份验证,Citrix Gateway 将显示用户有权使用的所有应用程序。

该解决方案需要两个公共 DNS 记录和两个公共 IP 地址:

说明
Citrix Gateway FQDN access.ctxdemos.com
Citrix 身份验证、授权和审核 FQDN aaa.ctxdemos.com

该解决方案使用一个公共 SSL 证书:

说明
普通名 access.ctxdemos.com
使用者备用名称 sts.ctxdemos.com
使用者备用名称 aaa.ctxdemos.com

该解决方案还使用由内部 Microsoft 证书颁发机构服务颁发的通配符 SSL 证书:

说明
普通名 *.ctxdemos.com

身份验证流程

序列图

下面的顺序图显示了解决方案的身份验证流程:

序列图

身份验证步骤

身份验证步骤是:

  1. 用户导航到 https://access.ctxdemos.com
  2. Citrix Gateway 将用户重定向到第一个 Citrix ADC AAA VIP(不可寻址)。
  3. 首先 Citrix ADC AAA VIP 使用无体系结构登录,该登录配置为单点登录。然后它开始处理高级身份验证策略。
  4. 第一个身份验证策略是 SAML SP 到不可寻址的 LB VIP,以生成身份验证 Cookie。
  5. 帮助器 LB VIP 配置为使用第二个 Citrix ADC AAA VIP(可寻址)进行身份验证。因此,它会将用户重定向到第二个身份验证、授权和审核 VIP。
  6. 第二个 Citrix ADC AAA VIP 使用Username Only 登录体系结构,提示用户输入用户名。然后它开始处理高级身份验证策略。
  7. 第一个身份验证策略是组提取,用于查询本地 AD 中的用户名,并验证用户是否属于 AzureMFACAUsers 安全组。验证结果成功后,它将开始处理下一个身份验证因素,即 LDAP 策略。
  8. LDAP 策略使用UsernameAndPassword 登录体系结构和预填充的用户名字段,并提示用户输入 AD 密码。
  9. 当第二个 Citrix ADC AAA VIP 上的身份验证成功完成时,它将返回到帮助程序 LB VIP,该辅助程序将为第一个身份验证、授权和审核 VIP 生成 SAML 响应。
  10. 第一个 Citrix ADC AAA VIP 开始处理下一个因素,即组提取,以确保从 AD 中提取用户的组并存储在身份验证、授权和审计变量中,以便稍后在此过程中使用。
  11. 第一个 Citrix ADC AAA VIP 开始处理下一个因素,这是 Citrix ADC 上的 SAML SP 到 AD FS 代理 VIP。

    注意:

    Citrix ADC 与 AD FS 场联合。详细步骤将在后面的章节中进行说明。

  12. AD FS 代理 VIP 验证身份验证 Cookie(NSC_TMAA 和 NSC_TMAS)是否已设置。然后它将 SAML 请求发送到后端 AD FS 服务器(后端 AD FS 服务器应在内部 Citrix ADC 上进行负载平衡,以实现服务的高可用性和弹性)。
  13. AD FS 服务器处理 SAML 请求。由于中继方上的访问策略设置为“允许所有用户并要求 MFA 进行身份验证”,因此它会触发 Azure MFA 身份验证过程。
  14. Azure MFA 处理用户名。如果已注册,则会使用配置的方法向用户提出质询。否则,它会提示用户注册并设置主身份验证方法和辅助身份验证方法。
  15. 一旦成功完成 Azure MFA 身份验证过程,AD FS 将为 Citrix Gateway(第一个 Citrix ADC AAA VIP)生成一个 SAML 响应。
  16. 首先 Citrix ADC AAA VIP 会收到 SAML 响应,并确认用户的身份验证过程已完成。
  17. Citrix Gateway 向 Citrix StoreFront 发送身份验证信息,该信息会枚举授权用户使用的所有应用程序和桌面。此外,它会处理用户的组成员资格以在 Citrix Gateway 上显示已发布的书签。

身份验证屏幕

上面提到的大多数步骤对用户来说都是无缝的,因为这些步骤是在 Citrix ADC 上的各个 VIP 之间内部进行的。用户体验如下所示:

Citrix Gateway 登录页面用户名 Citrix Gateway 登录页面用户名和密码 验证码

实现

Microsoft AD FS

证书要求

联合身份验证服务器需要下表中的证书:

证书类型 说明 在部署之前需要知道什么
安全套接字层 (SSL) 证书 这是标准的安全套接字层 (SSL) 证书,用于保护联合身份验证服务器与客户端之间的通信。 此证书必须绑定到联合身份验证服务器或联合身份验证服务器代理的 Internet 信息服务 (IIS) 中的默认网站。对于联合身份验证服务器代理,在成功运行联合身份验证服务器代理配置向导之前,必须在 IIS 中配置绑定。建议:由于此证书必须受 AD FS 客户端的信任,因此请使用由公共(第三方)证书颁发机构 (CA) 颁发的服务器身份验证证书。例如,威瑞信。提示:此证书的使用者名称用于表示您部署的每个 AD FS 实例的联合身份验证服务名称。出于这个原因,您可能需要考虑在 CA 颁发的任何新证书上选择一个主题名称,该名称最能代表合作伙伴的公司或组织的名称。
服务通信证书 此证书启用 WCF 消息安全性,以保护联合身份验证服务器之间的通信。 默认情况下,SSL 证书用作服务通信证书。这可以使用 AD FS 管理控制台进行更改。
令牌签名证书 这是标准 X509 证书,用于对联合身份验证服务器颁发的所有令牌安全地进行签名。 令牌签名证书必须包含私钥,并且该证书应链接到联合身份验证服务中的受信任根目录。默认情况下,AD FS 会创建自签名证书。但是,您可以稍后使用 AD FS Management 管理单元将其更改为 CA 颁发的证书,具体取决于组织的需求。
令牌解密证书 这是标准 SSL 证书,用于解密由合作伙伴联合身份验证服务器加密的任何传入令牌。它还发布在联合身份验证元数据中。 默认情况下,AD FS 会创建自签名证书。但是,您可以稍后使用 AD FS Management 管理单元将其更改为 CA 颁发的证书,具体取决于组织的需求。

演示环境配置

证书类型 演示环境配置
安全套接字层 (SSL) 证书 由 AD FS 服务器上的内部颁发 CA 颁发的内部证书。Citrix ADC 上的公共可信证书。
服务通信证书 由 AHS 内部颁发证书颁发机构颁发的内部证书。
令牌签名证书 由 AD FS 服务自动生成。
令牌解密证书 由 AD FS 服务自动生成。

在演示环境中,将注册通配符证书并安装在服务器上。

证书机构

服务帐户要求

您可以创建服务帐户或利用组托管服务帐户 (gMSA)。要使用 gMSA,您需要创建密钥分发服务根密钥。因此,请启动 PowerShell 并运行以下命令:

Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))
<!--NeedCopy-->

此命令创建存储在 Active Directory 中的密钥分发服务根密钥,并允许您创建一个组托管服务帐户 (gMSA) 作为以后创建的 AD FS 服务帐户。使用域管理员权限运行此命令。

根密钥

DNS 记录要求

在内部和外部,您的 AD FS 联合身份验证服务名称都需要 DNS A 记录。在演示环境中,内部 DNS 记录指向 AD FS 服务器 IP,外部 DNS 记录指向 Citrix Gateway 公有 IP。

记录名 作用域 类型 IP 地址
sts.ctxdemox.com 内部 A 22.22.22.6
sts.ctxdemox.com 外部 A 40.85.225.175

添加 AD FS 角色并配置 AD FS 场

添加 AD FS 角色

要将 AD FS 角色添加到 Windows Server 2016,请启动 PowerShell 并运行以下命令:

Install-WindowsFeature AD FS-Federation -IncludeManagementTools
<!--NeedCopy-->

PowerShell 命令

配置 AD FS 场

现在,您可以从服务器管理器开始 AD FS 部署后配置。单击 在此服务器上配置联合身份验证服务

部署后配置

在“欢迎”页上,选择“在 联合服务器场中创建第一个联合服务器”,然后单击“ 一步”。

创建第一个联合身份验证服务器

连接到 Active Directory 域服务页面上,确保指定了域管理员帐户,然后单击下一步

连接到 Active Directory 域服务

在“指定服务属性”页上,完成以下步骤,然后单击“下一 步”:

  • 选择在前面的步骤中安装在服务器上的证书。
  • 联合身份验证服务名称将根据证书的主题名称自动填充。
  • 输入联合身份验证服务的显示名称。例如,CTXDEMOS STS

指定服务属性

在“指定服务帐户”页上,选择“创建组托管服务帐户”,然后为此帐户输入唯一名称。Windows Server 2012 以后支持组托管服务帐户,并附带严格、复杂的密码,每 30 天自动更改一次。单击下一步

创建群组托管服务帐户

在“指定配置数据库”页上,选择指定 SQL Server 数据库的位置。单击下一步

指定配置数据库

在“查看选项”页上,验证您的配置选择,然后单击“下一步”。

查看选项

在“先决条件检查”页上,验证所有先决条件检查是否已成功完成,然后单击“配置”。

必备条件检查

在“结 ”页面上,确保安装成功。单击关闭退出向导。

部署后配置结果

注意:

要完成以下步骤,需要您的 Azure 租户 ID。

您可以按照 Microsoft 文档文章获取 AzureID 租户 详细信息中的步骤获取 Azure 租户 ID

Microsoft 文档还提供了有关 配置 AD FS 2016 和 Azure MFA 中的 Azure MFA客户端 GUID 的信息。

配置 AD FS 场-自动

可以运行以下 PowerShell 脚本:

#
# Windows PowerShell script for AD FS Deployment
#
Import-Module ADFS
Install-AdfsFarm `
-CertificateThumbprint:"BD02F30D90A96EEE4A5934F2EA979E7A052584AE" `
-FederationServiceDisplayName:"CTXDEMOS STS" `
-FederationServiceName:"adfs.ctxdemos.com" `
-GroupServiceAccountIdentifier:"C
<!--NeedCopy-->

使用 Azure MFA 配置 AD FS

配置 AD FS 服务器

在每个 AD FS 服务器上,启动 PowerShell 并运行以下命令:

# Install Windows PowerShell MSOnline Module
Install-Module MSOnline

# Import Windows PowerShell MSOnline Module
Import-Module MSOnline

# Get the Azure Global Administrator credential
$credential = Get-Credential

# Sign in to your Azure Active Directory environment
Connect-MsolService -Credential $credential

# Set a variable for the Azure Tenant name
$azureTenantID = "ctxdemos.onmicrosoft.com"

# Set a variable for the Azure MFA Client GUID
$azureMFAClientGUID = "981f26a1-7f43-403b-a875-f8b09b8cd720"

# Generate a certificate for the Azure MFA on AD FS server
$azureMFACertificate = New-AdfsAzureMfaTenantCertificate -TenantId $azureTenantID

# Add the new credentials to the Azure MFA Client Service Principal
New-MsolServicePrincipalCredential -AppPrincipalId $azureMFAClientGUID -Type asymmetric -Usage verify -
Value $azureMFACertificate
<!--NeedCopy-->

配置 AD FS 场

仅在其中一个 AD FS 服务器上,运行以下命令:

Set-AdfsAzureMfaTenant -TenantId $azureTenantID -ClientId $azureMFAClientGUID
<!--NeedCopy-->

在每台服务器上重新启动 AD FS 服务。然后您会看到 Azure MFA 可用作内部网和外联网使用的主要身份验证方法和多重身份验证方法。

主要身份验证方法

多重身份验证方法

使用 Citrix ADC 配置 AD FS

您需要在 AD FS 和 Citrix ADC 之间创建联合身份验证信任。在 AD FS 管理控制台中,导航到信赖方信任,然后选择添加信赖方信任

添加信赖方信任

选择手动输入有关信赖方的数据,然后单击下一步

输入有关信赖方的数据

输入描述性显示名称和可选备注。单击下一步

可选备注

单击下一步

配置证书

选择启用对 SAML 2.0 WebSSO 协议的支持,然后输入 https://CitrixGatewayFQDN/cgi/samlauth。在演示环境中,为 https://access.ctxdemos.com/cgi/samlauth。单击下一步

配置 URL

输入信赖方信任的唯一标识符字符串。在演示环境中,为 https://access.ctxdemos.com。此标识符将用作 Citrix ADC SAML 配置文件中的发布者 URL。单击下一步

配置标识符

在“选择访问控制策略”页面上,选择“允许所有人并要求 MFA”。单击下一步

访问控制策略

单击下一步

添加信任

在“ 成”页面上,选择“为此应用程序配置声明发布策略”。单击关闭

完成

在“发行转换规则”页上,单击“添加规则”。

添加规则

单击下一步

选择模板

声明规则名称字段中输入描述性名称。在属性存储下,选择 Active Directory。然后选择以下选项:LDAP 属性传出声明类型

配置规则

创建新规则并使用使用自定义规则作为声明规则模板发送声明。输入声明规则名称的描述性名称,并为自定义规则输入以下字符串:

=> issue(Type = "logoutURL", Value = "https://access.ctxdemos.com/cgi/tmlogout", Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/attributename"] = "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified");
<!--NeedCopy-->

配置规则

创建“索赔发放策略”后,单击“确定”。

右键单击“信 赖方信任”>“Citrix ADC”,然后选择“属性”。通过单击添加 SAML 进行注销,选择端点并添加端点。从端点类型列表中,选择 SAML 注销。对于“绑定”,选择“POST”,对于“受信任的 URL”,输入 https://sts.ctxdemos.com/adfs/ls/?wa=wsignout1.0。注销 Citrix ADC 时,这将充当注销 URL。单击确定

SAML 注销

右键单击“信 赖方信任”>“Citrix ADC”,然后选择“属性”。选择加密并添加安装在 Citrix Gateway 上的公有 SSL 证书。此证书将用于解密来自 Citrix ADC 的传入 SML 请求。在“签名”选项卡上重复相同的操作。此证书将用于检查传入的 SAML 请求的签名。单击确定

启用 IdP 启动的登录页面

您可以启用 AD FS IdP 启动的登录页面。您将使用 IdP 启动的登录向未注册的 MFA 用户显示自定义错误页面。要启用,请运行以下命令:

Set-AdfsProperties -EnableIdPInitiatedSignonPage $true
<!--NeedCopy-->

测试 AD FS 场

打开 Web 浏览器并导航至:

Citrix ADC 和 Citrix Gateway

配置 Citrix Gateway

您可以通过向导配置 Citrix Gateway。登录到 Citrix ADC 管理 GUI,导航到 Unified Gateway,然后单击创建新网关。然后单击继续

单一公开访问

输入 Unified Gateway 的名称、IP 和 FQDN,然后单击继续

Citrix Gateway 配置

选择公用 SSL 证书,然后单击继续

服务器证书

创建基本的 LDAP 策略并将其绑定到 Unified Gateway。单击继续

身份验证

创建基于 RfWebUI 的门户主题并将其绑定到 Unified Gateway。单击继续

门户主题

选择应用程序前面的加号 (+) 以将 Citrix Gateway 与 StoreFront 集成。

将 Gateway 与 StoreFront 集成

将 Citrix StoreFront 集成到 Citrix Gateway

在“应用程序”页面上,选择 XenApp 和 XenDesktop,然后从选择集成点列表中选择 StoreFront。单击继续

选择多个设置

输入 StoreFront URL,然后单击检索应用商店。然后输入默认 Active Directory 域Secure Ticket Authority URL 设置。单击测试 STA 连接,然后单击继续

测试连通性

单击 完成 ,然后单击 继续

继续

配置 Citrix Gateway 并与 StoreFront 集成 – CLI

# Create Session Policy and Action for Citrix Receiver
add vpn sessionAction AC_OS_22.22.44.50 -transparentInterception OFF -defaultAuthorizationAction ALLOW -SSO ON -icaProxy ON -wihome "https://access.ctxdemos.com/Citrix/ExternalWeb" -ClientChoices OFF -ntDomain CTXDEMOS -clientlessVpnMode OFF -storefronturl "https://access.ctxdemos.com"
add vpn sessionPolicy PL_OS_22.22.44.50 "HTTP.REQ.HEADER("User-Agent").CONTAINS("CitrixReceiver") && HTTP.REQ.HEADER("User-Agent").CONTAINS("CitrixVPN").NOT && HTTP.REQ.HEADER("User-Agent").CONTAINS("NSGiOSplugin").NOT" AC_OS_22.22.44.50

# Create Session Policy and Action for Citrix Web Client
add vpn sessionAction AC_WB_22.22.44.50 -transparentInterception ON -defaultAuthorizationAction ALLOW -forceCleanup cookie -SSO ON -ssoCredential PRIMARY -icaProxy OFF -wihome "https://storefront.ctxdemos.com/Citrix/ExternalWeb" -wiPortalMode COMPACT -ClientChoices OFF -ntDomain CTXDEMOS -clientlessVpnMode ON -clientlessPersistentCookie ALLOW
add vpn sessionPolicy PL_WB_22.22.44.50 "HTTP.REQ.HEADER("User-Agent").CONTAINS("CitrixReceiver").NOT" AC_WB_22.22.44.50

# Create Session Policy and Action for Citrix Gateway Client
add vpn sessionAction UG_VPN_SAct_22.22.44.50 -transparentInterception ON -defaultAuthorizationAction ALLOW -SSO ON -ClientChoices ON -clientlessVpnMode ON
add vpn sessionPolicy UG_VPN_SPol_22.22.44.50 true UG_VPN_SAct_22.22.44.50

# Create Responder Policy and Action for Gateway Logout
add responder action RESACT_GATEWAY_LOGOFF_REDIRECT redirect ""https://" + HTTP.REQ.HOSTNAME.HTTP_URL_SAFE" -responseStatusCode 302
add responder policy RESPOL_GATEWAY_LOGOFF_REDIRECT "HTTP.REQ.URL.CONTAINS("/cgi/logout")" RESACT_GATEWAY_LOGOFF_REDIRECT

# Create Citrix Gateway vServer
add vpn vserver UGVS_VPN_UGCTXDEMOS SSL 0.0.0.0 -loginOnce ON -Listenpolicy NONE -vserverFqdn access.ctxdemos.com
set ssl vserver UGVS_VPN_UGCTXDEMOS -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver UGVS_VPN_UGCTXDEMOS -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver UGVS_VPN_UGCTXDEMOS -cipherName CTXDEMOS_FRONTEND_APLUS
bind vpn vserver UGVS_VPN_UGCTXDEMOS -portaltheme CTXDEMOS_PORTAL
bind vpn vserver UGVS_VPN_UGCTXDEMOS -staServer "https://wsctxdc01.ctxdemos.com"
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy RESPOL_GATEWAY_LOGOFF_REDIRECT -priority 100 -gotoPriorityExpression END -type REQUEST
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy PL_OS_22.22.44.50 -priority 100 -gotoPriorityExpression NEXT -type REQUEST
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy PL_WB_22.22.44.50 -priority 110 -gotoPriorityExpression NEXT -type REQUEST
bind vpn vserver UGVS_VPN_UGCTXDEMOS -policy UG_VPN_SPol_22.22.44.50 -priority 58000 -gotoPriorityExpression NEXT -type REQUEST

# Create Content Switching Policy and Action for Citrix Gateway
add cs action CSACT_UGCTXDEMOS -targetVserver UGVS_VPN_UGCTXDEMOS
add cs policy CSPOL_UGCTXDEMOS -rule "is_vpn_url  ||  HTTP.REQ.URL.PATH.SET_TEXT_MODE(IGNORECASE).STARTSWITH("/Citrix/External")" -action CSACT_UGCTXDEMOS

# Create Content Switching vServer for Citrix Gateway
add cs vserver CSVS_UGCTXDEMOS SSL 22.22.44.50 443 -cltTimeout 180
set ssl vserver CSVS_UGCTXDEMOS -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver CSVS_UGCTXDEMOS -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver CSVS_UGCTXDEMOS -cipherName CTXDEMOS_FRONTEND_APLUS
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_UGCTXDEMOS -priority 63000

# Create Responder Policy and Action for HTTP to HTTPS Redirection
add responder action RESACT_HTTP_TO_HTTPS redirect ""https://" + HTTP.REQ.HOSTNAME.HTTP_URL_SAFE + HTTP.REQ.URL.PATH_AND_QUERY.HTTP_URL_SAFE" -responseStatusCode 301
add responder policy RESPOL_HTTP_TO_HTTPS HTTP.REQ.IS_VALID RESACT_HTTP_TO_HTTPS

# Create Always On Server and Service
add server LBSRV_ALWAYS_UP 127.0.0.1
add service LBSVC_ALWAYS_UP LBSRV_ALWAYS_UP HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip ENABLED cip-header -usip YES -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP NO

# Create Always On vServer for Citrix Gateway
add lb vserver CSVS_UGCTXDEMOS_REDIRECT_HTTP_TO_HTTPS HTTP 22.22.44.50 80 -persistenceType NONE -cltTimeout 180
bind lb vserver CSVS_UGCTXDEMOS_REDIRECT_HTTP_TO_HTTPS LBSVC_ALWAYS_UP
bind lb vserver CSVS_UGCTXDEMOS_REDIRECT_HTTP_TO_HTTPS -policyName RESPOL_HTTP_TO_HTTPS -priority 100 -gotoPriorityExpression END -type REQUEST
<!--NeedCopy-->

配置第一台身份验证服务器

# Create Initialization SAML SP Policy and Action and Bind it to Citrix ADC AAA Authentication vServer
add authentication samlAction AUTH_ACT_SAML_SP_VPN_TO_LB -samlIdPCertName CTXDEMOS_PUBLIC_CERT -samlSigningCertName CTXDEMOS_PUBLIC_CERT -samlRedirectUrl "https://access.ctxdemos.com/samltolb" -signatureAlg RSA-SHA256 -digestMethod SHA256 -samlBinding REDIRECT -groupNameField Groups
add authentication Policy AUTH_POL_SAMP_SP_VPN_TO_LB -rule TRUE -action AUTH_ACT_SAML_SP_VPN_TO_LB

# Create Authentication Policy and Action for SAML SP to ADFS
add authentication samlAction AUTH_ACT_SAML_SP_ADFS -samlIdPCertName CTXDEMOS_ADFS_TOKEN_SIGNING -samlSigningCertName CTXDEMOS_PUBLIC_CERT -samlRedirectUrl "https://sts.ctxdemos.com/adfs/ls/" -samlUserField "Name ID" -samlRejectUnsignedAssertion OFF -samlIssuerName "https://access.ctxdemos.com" -Attribute1 "E-Mail Address" -signatureAlg RSA-SHA256 -digestMethod SHA256 -logoutURL "https://sts.ctxdemos.com/adfs/ls/wa=wsignout1.0" -forceAuthn ON
add authentication Policy AUTH_POL_SAML_SP_ADFS -rule TRUE -action AUTH_ACT_SAML_SP_ADFS

# Create Authentication Policy Label for for SAML SP to ADFS
add authentication policylabel AUTH_POLLBL_ADFS_AZUREMFA -loginSchema LSCHEMA_INT
bind authentication policylabel AUTH_POLLBL_ADFS_AZUREMFA -policyName AUTH_POL_SAML_SP_ADFS -priority 100 -gotoPriorityExpression NEXT

# Create Authentication Policy and Action for Group Extraction
add authentication ldapAction AUTH_ACT_LDAP_GROUP_EXTRACTION_AZUREMFACA -serverIP 22.22.22.61 -serverPort 636 -ldapBase "DC=ctxdemos,DC=com" -ldapBindDn "CN=svc_ctxadc01,OU=Services,OU=Accounts,DC=ctxdemos,DC=com" -ldapBindDnPassword 0c4fe86d56a865ef514a15affd1429f3e079ce1089731d4a407772d21036f3c8 -encrypted -encryptmethod ENCMTHD_3 -ldapLoginName sAMAccountName -searchFilter "memberOf:1.2.840.113556.1.4.1941:=CN=AzureMFACAUsers,OU=Groups,OU=Authorizations,DC=ctxdemos,DC=com" -groupAttrName memberOf -subAttributeName cn -secType SSL -authentication DISABLED -nestedGroupExtraction ON -maxNestingLevel 5 -groupNameIdentifier sAMAccountName -groupSearchAttribute memberOf -groupSearchSubAttribute CN -Attribute1 mail -Attribute2 objectGUID
add authentication Policy AUTH_POL_LDAP_GROUP_EXTRACTION_AZURAMFACA -rule TRUE -action AUTH_ACT_LDAP_GROUP_EXTRACTION_AZUREMFACA

# Create Authentication Policy Label for Group Extraction
add authentication policylabel AUTH_POLLBL_LDAP_GROUP_EXTRACTION_AZURAMFACA -loginSchema LSCHEMA_INT
bind authentication policylabel AUTH_POLLBL_LDAP_GROUP_EXTRACTION_AZURAMFACA -policyName AUTH_POL_LDAP_GROUP_EXTRACTION_AZURAMFACA -priority 100 -gotoPriorityExpression NEXT -nextFactor AUTH_POLLBL_ADFS_AZUREMFA


# Create Login Schema Policy and Profile for First Citrix ADC AAA Authentication vServer
add authentication loginSchema LSCHEMA_PRF_NOSCHEMA -authenticationSchema noschema -SSOCredentials YES
add authentication loginSchemaPolicy LSCHEMA_POL_NOSCHEMA -rule TRUE -action LSCHEMA_PRF_NOSCHEMA

# Create First Citrix ADC AAA Authentication vServer
add authentication vserver AAAVS_CTXDEMOS_COM_FOR_VPN SSL 0.0.0.0
set ssl vserver AAAVS_CTXDEMOS_COM_FOR_VPN -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver AAAVS_CTXDEMOS_COM_FOR_VPN -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver AAAVS_CTXDEMOS_COM_FOR_VPN -cipherName CTXDEMOS_FRONTEND_APLUS
bind authentication vserver AAAVS_CTXDEMOS_COM_FOR_VPN -policy LSCHEMA_POL_NOSCHEMA -priority 100 -gotoPriorityExpression END
bind authentication vserver AAAVS_CTXDEMOS_COM_FOR_VPN -policy AUTH_POL_SAMP_SP_VPN_TO_LB -priority 100 -nextFactor AUTH_POLLBL_LDAP_GROUP_EXTRACTION_AZURAMFACA -gotoPriorityExpression NEXT

# Create First Citrix ADC AAA Authentication Profile
add authentication authnProfile AAA_AUTH_PRF_VPN -authnVsName AAAVS_CTXDEMOS_COM_FOR_VPN -AuthenticationHost aaa.ctxdemos.com

# Set Authentication Profile on Gateway vServer
set vpn vserver UGVS_VPN_UGCTXDEMOS -authnProfile AAA_AUTH_PRF_VPN
<!--NeedCopy-->

配置第二台身份验证服务器

# Create Authentication Policy and Action for LDAP
add authentication ldapAction AUTH_ACT_LDAP -serverIP 22.22.22.61 -serverPort 636 -authTimeout 60 -ldapBase "DC=ctxdemos,DC=com" -ldapBindDn "CN=svc_ctxadc01,OU=Services,OU=Accounts,DC=ctxdemos,DC=com" -ldapBindDnPassword 273881819af883e70c33d83c0546eac84e81d6eeba904f2d65bbebf2819c025a -encrypted -encryptmethod ENCMTHD_3 -ldapLoginName sAMAccountName -groupAttrName memberOf -subAttributeName cn -secType SSL -passwdChange ENABLED -nestedGroupExtraction ON -maxNestingLevel 5 -groupNameIdentifier sAMAccountName -groupSearchAttribute memberOf -groupSearchSubAttribute CN -Attribute1 userprincipalname -Attribute2 mail -Attribute3 userParameters
add authentication Policy AUTH_POL_LDAP_USER_NAME_PASSWORD -rule TRUE -action AUTH_ACT_LDAP

# Create Login Schema Policy and Profile for Second Citrix ADC AAA Authentication vServer - Username (Pre-filled ) and Password
add authentication loginSchema LSCHEMA_USER_NAME_PASSWORD -authenticationSchema "/nsconfig/loginschema/CTXDEMOS_USER_NAME_PASS.xml" -SSOCredentials YES
add authentication loginSchemaPolicy LSCHEMA_POL_USER_NAME_PASSWORD -rule TRUE -action LSCHEMA_USER_NAME_PASSWORD

# Create Authentication Policy Label for LDAP Username and Password
add authentication policylabel AUTH_POLLBL_LDAP_USER_NAME_PASSWORD -loginSchema LSCHEMA_USER_NAME_PASSWORD
bind authentication policylabel AUTH_POLLBL_LDAP_USER_NAME_PASSWORD -policyName AUTH_POL_LDAP_USER_NAME_PASSWORD -priority 110 -gotoPriorityExpression NEXT

# Create Login Schema Policy and Profile for Second Citrix ADC AAA Authentication vServer - Username Only
add authentication loginSchema LSCHEMA_USER_NAME_ONLY -authenticationSchema "/nsconfig/loginschema/CTXDEMOS_USER_NAME_ONLY.xml"
add authentication loginSchemaPolicy LSCHEMA_POL_NOPASSWORD -rule TRUE -action LSCHEMA_USER_NAME_ONLY

# Create Citrix ADC AAA Session Policy and Profile
add tm sessionAction AAA_SESSION_PRF_CTXDEMOS -SSO ON -ssoDomain CTXDEMOS -persistentCookie ON -persistentCookieValidity 30
add tm sessionPolicy AAA_SESSION_POL_CTXDEMOS TRUE AAA_SESSION_PRF_CTXDEMOS

# Create Second Citrix ADC AAA Authentication vServer
add authentication vserver AAAVS_CTXDEMOS_COM SSL 22.22.44.51 443
set ssl vserver AAAVS_CTXDEMOS_COM -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver AAAVS_CTXDEMOS_COM -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver AAAVS_CTXDEMOS_COM -cipherName CTXDEMOS_FRONTEND_APLUS
bind authentication vserver AAAVS_CTXDEMOS_COM -portaltheme CTXDEMOS_PORTAL
bind authentication vserver AAAVS_CTXDEMOS_COM -policy AAA_SESSION_POL_CTXDEMOS -priority 100 -gotoPriorityExpression NEXT
bind authentication vserver AAAVS_CTXDEMOS_COM -policy LSCHEMA_POL_NOPASSWORD -priority 110 -gotoPriorityExpression END
bind authentication vserver AAAVS_CTXDEMOS_COM -policy AUTH_POL_LDAP_GROUP_EXTRACTION_AZURAMFACA -priority 140 -nextFactor AUTH_POLLBL_LDAP_USER_NAME_PASSWORD -gotoPriorityExpression NEXT

# Create Second Citrix ADC AAA Authentication Profile
add authentication authnProfile AAA_AUTH_PRF -authnVsName AAAVS_CTXDEMOS_COM -AuthenticationHost aaa.ctxdemos.com
<!--NeedCopy-->

将 Citrix ADC 配置为 AD FS WAP

在 Citrix ADC CLI 中运行以下命令以将 Citrix ADC 配置为 AD FS Web 应用程序代理 (WAP):

# Pattern Set - ADFS Proxy Hostname
add policy patset PATSET_ADFS_HOSTNAME
bind policy patset PATSET_ADFS_HOSTNAME sts.ctxdemos.com -index 1 -charset ASCII
# Policy Expression - ADFS Proxy Hostname
add policy expression is_ADFS_HOSTNAME "HTTP.REQ.HEADER("Host").TO_LOWER.CONTAINS_ANY("PATSET_ADFS_HOSTNAME")"

# Pattern Set - ADFS Proxy Path for NoAuth
add policy patset PATSET_ADFS_PATH_NOAUTH
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/services/trust" -index 1 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/federationmetadata/2007-06/federationmetadata.xml" -index 2 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/fs/federationserverservice.asmx" -index 3 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/ls/FormsSignIn.aspx" -index 4 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/services/trust/2005/usernamemixed" -index 5 -charset ASCII
bind policy patset PATSET_ADFS_PATH_NOAUTH "/adfs/services/trust/mex" -index 6 -charset ASCII

# Policy Expression - ADFS Proxy Path for NoAuth
add policy expression is_ADFS_PROXY_NOAUTH "HTTP.REQ.URL.PATH.TO_LOWER.CONTAINS_ANY("PATSET_ADFS_PATH_NOAUTH")"

# Pattern Set - ADFS Proxy Path for Passive Client
add policy patset PATSET_ADFS_PATH_ACTIVE_PASSIVE
bind policy patset PATSET_ADFS_PATH_ACTIVE_PASSIVE "/adfs" -index 1 -charset ASCII
bind policy patset PATSET_ADFS_PATH_ACTIVE_PASSIVE "/cgi/selfauth" -index 2 -charset ASCII

# Policy Expression - ADFS Proxy Path for Passive Client
add policy expression is_ADFS_PROXY_ACTIVE_PASSIVE "(HTTP.REQ.HEADER("Host").TO_LOWER.CONTAINS_ANY("PATSET_ADFS_HOSTNAME") && HTTP.REQ.URL.PATH.TO_LOWER.STARTSWITH_ANY("PATSET_ADFS_PATH_ACTIVE_PASSIVE"))"

# Rewrite Policies for ADFS PIP
add rewrite action RWACT_X_MS_Proxy insert_http_header X-MS-Proxy ""NETSCALER""
add rewrite policy RWPOL_X_MS_Proxy true RWACT_X_MS_Proxy

add rewrite action RWACT_X_MS_Forwarded_Client_IP insert_http_header X-MS-Forwarded-Client-IP CLIENT.IP.SRC
add rewrite policy RWPOL_X_MS_Forwarded_Client_IP true RWACT_X_MS_Forwarded_Client_IP

add rewrite action RWACT_X_MS_Endpoint_Absolute_Path insert_http_header X-MS-Endpoint-Absolute-Path HTTP.REQ.URL
add rewrite policy RWPOL_X_MS_Endpoint_Absolute_Path true RWACT_X_MS_Endpoint_Absolute_Path

add rewrite action RWACT_X_MS_Target_Role insert_http_header X-MS-Target-Role ""PrimaryComputer""
add rewrite policy RWPOL_X_MS_Target_Role true RWACT_X_MS_Target_Role

add rewrite action RWACT_X_MS_ADFS_Proxy_Client_IP insert_http_header X-MS-ADFS-Proxy-Client-IP CLIENT.IP.SRC
add rewrite policy RWPOL_X_MS_ADFS_Proxy_Client_IP true RWACT_X_MS_ADFS_Proxy_Client_IP

add rewrite action RWACT_X_MS_Client_User_Agent insert_http_header X-MS-Client-User-Agent "HTTP.REQ.HEADER("User-Agent")"
add rewrite policy RWPOL_X_MS_Client_User_Agent true RWACT_X_MS_Client_User_Agent

add rewrite action RWACT_ADFS_PROXYMEX replace HTTP.REQ.URL.PATH_AND_QUERY ""/adfs/services/trust/proxymex" + HTTP.REQ.URL.SET_TEXT_MODE(IGNORECASE).PATH_AND_QUERY.STRIP_START_CHARS("/adfs/services/trust/mex").HTTP_URL_SAFE"
add rewrite policy RWPOL_ADFS_PROXYMEX "is_ADFS_HOSTNAME && HTTP.REQ.URL.TO_LOWER.STARTSWITH("/adfs/services/trust/mex")" RWACT_ADFS_PROXYMEX

add rewrite policy RWPOL_ADFS_PROXY_HEADERS-NOACT TRUE NOREWRITE

add rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS http_req
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Proxy 100 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Forwarded_Client_IP 110 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Endpoint_Absolute_Path 120 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Target_Role 130 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_ADFS_Proxy_Client_IP 140 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_X_MS_Client_User_Agent 150 NEXT
bind rewrite policylabel RWPOLLBL_ADFS_PROXY_HEADERS RWPOL_ADFS_PROXYMEX 160 NEXT

# Create ADFS Server and Service Group
add server LBSRV_ADFS wsadfs01.ctxdemos.com
add serviceGroup LBSVCGRP_ADFS_443 SSL -maxClient 0 -maxReq 0 -cip ENABLED X-MS-Forwarded-Client-IP -usip NO -useproxyport YES -sp ON -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP YES
bind ssl serviceGroup LBSVCGRP_ADFS_443 -cipherName CTXDEMO_BACKEND
set ssl serviceGroup LBSVCGRP_ADFS_443 -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED
bind serviceGroup LBSVCGRP_ADFS_443 LBSRV_ADFS 443

# Create ADFS Proxy NoAuth Load Balancing vServer
add lb vserver LBVS_ADFS_PROXY_NOAUTH SSL 0.0.0.0 0 -persistenceType NONE -cltTimeout 180
set ssl vserver LBVS_ADFS_PROXY_NOAUTH -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind ssl vserver LBVS_ADFS_PROXY_NOAUTH -certkeyName CTXDEMOS-PUBLIC
bind ssl vserver LBVS_ADFS_PROXY_NOAUTH -cipherName CTXDEMO_BACKEND
bind lb vserver LBVS_ADFS_PROXY_NOAUTH LBSVCGRP_ADFS_443
bind lb vserver LBVS_ADFS_PROXY_NOAUTH -policyName RWPOL_ADFS_PROXY_HEADERS-NOACT -priority 100 -gotoPriorityExpression NEXT -type REQUEST -invoke policylabel RWPOLLBL_ADFS_PROXY_HEADERS

# Create ADFS Proxy NoAuth Content Switching Policy and Action
add cs action CSACT_ADFS_PROXY_NOAUTH -targetLBVserver LBVS_ADFS_PROXY_NOAUTH
add cs policy CSPOL_ADFS_PROXY_NOAUTH -rule is_ADFS_PROXY_NOAUTH -action CSACT_ADFS_PROXY_NOAUTH

# Create ADFS Proxy Active-Passive Load Balancing vServer
add lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE SSL 0.0.0.0 0 -persistenceType NONE -cltTimeout 180 -Authentication ON -authnProfile AAA_AUTH_PRF
set ssl vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE LBSVCGRP_ADFS_443
bind ssl vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -certkeyName CTXDEMOS-PUBLIC
bind ssl vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -cipherName CTXDEMO_FRONTEND_APLUS
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -policyName RWPOL_ADFS_PROXY_HEADERS-NOACT -priority 100 -gotoPriorityExpression NEXT -type REQUEST -invoke policylabel RWPOLLBL_ADFS_PROXY_HEADERS

# Create ADFS Proxy Active-Passive Content Switching Policy and Action
add cs action CSACT_ADFS_PROXY_ACTIVE_PASSIVE -targetLBVserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE
add cs policy CSPOL_ADFS_PROXY_ACTIVE_PASSIVE -rule is_ADFS_PROXY_ACTIVE_PASSIVE -action CSACT_ADFS_PROXY_ACTIVE_PASSIVE

# Bind Content Switching Policies to Citrix Gateway Content Switching vServer
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_ADFS_PROXY_NOAUTH -priority 100
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_ADFS_PROXY_ACTIVE_PASSIVE -priority 300

# Create Citrix ADC AAA Traffic Policies and Bind them to ADFS Proxy Active-Passive Load Balancing vServer
add tm formSSOAction AAATM_SSOPRF_ADFS_LOGIN -actionURL "/adfs/ls" -userField UserName -passwdField Password -ssoSuccessRule true -nameValuePair AuthMethod=FormsAuthentication -responsesize 15000 -submitMethod POST
add tm trafficAction AAATM_PRF_ADFS_LOGIN -appTimeout 1 -SSO ON -formSSOAction AAATM_SSOPRF_ADFS_LOGIN -persistentCookie OFF -InitiateLogout OFF -kcdAccount NONE -userExpression "HTTP.REQ.USER.ATTRIBUTE(3)" -passwdExpression "HTTP.REQ.USER.ATTRIBUTE(2)"
add tm trafficPolicy AAATM_POL_ADFS_LOGIN "HTTP.REQ.URL.TO_LOWER.STARTSWITH("/adfs/ls")" AAATM_PRF_ADFS_LOGIN
add tm trafficAction AAATM_PRF_ADFS_LOGOUT -appTimeout 1 -persistentCookie OFF -InitiateLogout ON -kcdAccount NONE
add tm trafficPolicy AAATM_POL_ADFS_LOGOUT "HTTP.REQ.URL.TO_LOWER.STARTSWITH("/adfs/ls") && HTTP.REQ.URL.QUERY.VALUE("wa").EQ("wsignout1.0")" AAATM_PRF_ADFS_LOGOUT
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -policyName AAATM_POL_ADFS_LOGIN -priority 100 -gotoPriorityExpression END -type REQUEST
bind lb vserver LBVS_ADFS_PROXY_ACTIVE_PASSIVE -policyName AAATM_POL_ADFS_LOGOUT -priority 110 -gotoPriorityExpression END -type REQUEST
<!--NeedCopy-->

配置初始身份验证流程

# Pattern Set - Gateway and AAA Hostname
add policy patset PATSET_GATEWAY_HOSTHEADER
bind policy patset PATSET_GATEWAY_HOSTHEADER access.ctxdemos.com -index 1 -charset ASCII
bind policy patset PATSET_GATEWAY_HOSTHEADER aaa.ctxdemos.com -index 2 -charset ASCII
# Policy Expression - Gateway and AAA Hostname
add policy expression is_GATEWAY_HOSTNAME "HTTP.REQ.HEADER("Host").TO_LOWER.CONTAINS_ANY("PATSET_GATEWAY_HOSTHEADER")"

# Create Initialization Load Balancing vServer
add lb vserver LBVS_SAML_SP_INITIALIZATION SSL 0.0.0.0 0 -persistenceType NONE -cltTimeout 180 -Authentication ON -authnProfile AAA_AUTH_PRF
set ssl vserver LBVS_SAML_SP_INITIALIZATION -ssl3 DISABLED -tls1 DISABLED -tls11 DISABLED -tls13 ENABLED -ocspStapling ENABLED -HSTS ENABLED -maxage 157680000 -IncludeSubdomains YES
bind lb vserver LBVS_SAML_SP_INITIALIZATION LBSVC_ALWAYS_UP
bind ssl vserver LBVS_SAML_SP_INITIALIZATION -certkeyName CTXDEMOS_PUBLIC_CERT
bind ssl vserver LBVS_SAML_SP_INITIALIZATION -cipherName CTXDEMOS_FRONTEND_APLUS

# Create Initialization Content Switching Policy and Action
add cs action CSACT_SAML_SP_INITIALIZATION -targetLBVserver LBVS_SAML_SP_INITIALIZATION
add cs policy CSPOL_SAML_SP_INITIALIZATION -rule "is_GATEWAY_HOSTNAME && HTTP.REQ.URL.PATH.TO_LOWER.STARTSWITH("/samltolb")" -action CSACT_SAML_SP_INITIALIZATION

# Bind Content Switching Policies to Citrix Gateway Content Switching vServer
bind cs vserver CSVS_UGCTXDEMOS -policyName CSPOL_SAML_SP_INITIALIZATION -priority 500

# Create Initialization Citrix ADC AAA Traffic Policy and Action and Bind it to Load Balancing vServer
add tm samlSSOProfile AAATM_SAMLSSOPRF_VPN_TO_LB -samlSigningCertName CTXDEMOS_PUBLIC_CERT -assertionConsumerServiceURL "https://access.ctxdemos.com/cgi/samlauth" -relaystateRule "HTTP.REQ.URL.QUERY.VALUE("RelayState")" -signatureAlg RSA-SHA256 -digestMethod SHA256 -Attribute1 Password -Attribute1Expr AAA.USER.PASSWD -Attribute2 Groups -Attribute2Expr AAA.USER.GROUPS -encryptAssertion ON -samlSPCertName CTXDEMOS_PUBLIC_CERT
add tm trafficAction AAATM_PRF_VPN_TO_LB -SSO ON -persistentCookie OFF -InitiateLogout OFF -kcdAccount NONE -samlSSOProfile AAATM_SAMLSSOPRF_VPN_TO_LB
add tm trafficPolicy AAATM_POL_VPN_TO_LB "HTTP.REQ.URL.STARTSWITH("/samltolb")" AAATM_PRF_VPN_TO_LB
bind lb vserver LBVS_SAML_SP_INITIALIZATION -policyName AAATM_POL_VPN_TO_LB -priority 100 -gotoPriorityExpression END -type REQUEST
<!--NeedCopy-->

密码组

# Create Cipher Group for Backend vServers
add ssl cipher CTXDEMOS_BACKEND
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.3-CHACHA20-POLY1305-SHA256 -cipherPriority 2
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 3
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 4
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 5
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-ECDSA-AES256-GCM-SHA384 -cipherPriority 6
bind ssl cipher CTXDEMOS_BACKEND -cipherName TLS1.2-ECDHE-ECDSA-AES128-GCM-SHA256 -cipherPriority 7

# Create Cipher Group for Frondend vServers
add ssl cipher CTXDEMOS_FRONTEND
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.3-CHACHA20-POLY1305-SHA256 -cipherPriority 2
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 3
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES128-GCM-SHA256 -cipherPriority 4
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES256-GCM-SHA384 -cipherPriority 5
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES128-SHA256 -cipherPriority 6
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-ECDSA-AES256-SHA384 -cipherPriority 7
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-ECDSA-AES128-SHA -cipherPriority 8
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-ECDSA-AES256-SHA -cipherPriority 9
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 10
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 11
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES-128-SHA256 -cipherPriority 12
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-ECDHE-RSA-AES-256-SHA384 -cipherPriority 13
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-RSA-AES128-SHA -cipherPriority 15
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-ECDHE-RSA-AES256-SHA -cipherPriority 16
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-DHE-RSA-AES128-GCM-SHA256 -cipherPriority 17
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1.2-DHE-RSA-AES256-GCM-SHA384 -cipherPriority 18
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-DHE-RSA-AES-128-CBC-SHA -cipherPriority 19
bind ssl cipher CTXDEMOS_FRONTEND -cipherName TLS1-DHE-RSA-AES-256-CBC-SHA -cipherPriority 20

# Create Cipher Group for Frondend vServers - A+
add ssl cipher CTXDEMOS_FRONTEND_APLUS
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.3-AES256-GCM-SHA384 -cipherPriority 1
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.3-CHACHA20-POLY1305-SHA256 -cipherPriority 2
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.3-AES128-GCM-SHA256 -cipherPriority 3
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES256-GCM-SHA384 -cipherPriority 4
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES128-GCM-SHA256 -cipherPriority 5
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-CHACHA20-POLY1305 -cipherPriority 6
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES256-SHA384 -cipherPriority 7
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-ECDSA-AES128-SHA256 -cipherPriority 8
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES256-GCM-SHA384 -cipherPriority 9
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES128-GCM-SHA256 -cipherPriority 13
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-CHACHA20-POLY1305 -cipherPriority 14
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES-256-SHA384 -cipherPriority 15
bind ssl cipher CTXDEMOS_FRONTEND_APLUS -cipherName TLS1.2-ECDHE-RSA-AES-128-SHA256 -cipherPriority 16
<!--NeedCopy-->

登录架构 XML 文件

CTXDEMOS_USER_NAME_PASS.XML

<?xml version="1.0" encoding="utf-8"?>
<AuthenticateResponse xmlns="http://citrix.com/authentication/response/1">
    <Status>success</Status>
    <Result>more-info</Result>
    <StateContext/>
    <AuthenticationRequirements>
        <PostBack>/nf/auth/doAuthentication.do</PostBack>
        <CancelPostBack>/Citrix/Authentication/ExplicitForms/CancelAuthenticate</CancelPostBack>
        <CancelButtonText>Cancel</CancelButtonText>
        <Requirements>
            <Requirement>
                <Credential>
                    <ID>login</ID>
                    <SaveID>ExplicitForms-Username</SaveID>
                    <Type>username</Type>
                </Credential>
                <Label>
                    <Text>User name</Text>
                    <Type>plain</Type>
                </Label>
                <Input>
                    <AssistiveText>Please supply username</AssistiveText>
                    <Text>
                        <Secret>false</Secret>
                        <ReadOnly>false</ReadOnly>
                        <InitialValue>${AAA.USER.NAME}</InitialValue>
                        <Constraint>.+</Constraint>
                    </Text>
                </Input>
            </Requirement>
            <Requirement>
                <Credential>
                    <ID>passwd</ID>
                    <SaveID>ExplicitForms-Password</SaveID>
                    <Type>password</Type>
                </Credential>
                <Label>
                    <Text>Password:</Text>
                    <Type>plain</Type>
                </Label>
                <Input>
                    <Text>
                        <Secret>true</Secret>
                        <ReadOnly>false</ReadOnly>
                        <InitialValue/>
                        <Constraint>.+</Constraint>
                    </Text>
                </Input>
            </Requirement>
            <Requirement>
                <Credential>
                    <ID>saveCredentials</ID>
                    <Type>savecredentials</Type>
                </Credential>
                <Label>
                    <Text>Remember my password</Text>
                    <Type>plain</Type>
                </Label>
                <Input>
                    <CheckBox>
                        <InitialValue>false</InitialValue>
                    </CheckBox>
                </Input>
            </Requirement>
            <Requirement>
                <Credential>
                    <ID>loginBtn</ID>
                    <Type>none</Type>
                </Credential>
                <Label>
                    <Type>none</Type>
                </Label>
                <Input>
                    <Button>Log On</Button>
                </Input>
            </Requirement>
        </Requirements>
    </AuthenticationRequirements>
</AuthenticateResponse>
<!--NeedCopy-->

CTXDEMOS_USER_NAME_ONLY.XML

<?xml version="1.0" encoding="utf-8"?>
<AuthenticateResponse xmlns="http://citrix.com/authentication/response/1">
    <Status>success</Status>
    <Result>more-info</Result>
    <StateContext/>
    <AuthenticationRequirements>
        <PostBack>/nf/auth/doAuthentication.do</PostBack>
        <CancelPostBack>/Citrix/Authentication/ExplicitForms/CancelAuthenticate</CancelPostBack>
        <CancelButtonText>Cancel</CancelButtonText>
        <Requirements>
            <Requirement>
                <Credential>
                    <ID>login</ID>
                    <SaveID>ExplicitForms-Username</SaveID>
                    <Type>username</Type>
                </Credential>
                <Label>
                    <Text>User name</Text>
                    <Type>plain</Type>
                </Label>
                <Input>
                    <AssistiveText>Please supply username</AssistiveText>
                    <Text>
                        <Secret>false</Secret>
                        <ReadOnly>false</ReadOnly>
                        <InitialValue/>
                        <Constraint>.+</Constraint>
                    </Text>
                </Input>
            </Requirement>
            <Requirement>
                <Credential>
                    <Type>none</Type>
                </Credential>
                <Label>
                    <Text> Please submit credentials to continue Login ...</Text>
                    <Type>confirmation</Type>
                </Label>
                <Input/>
            </Requirement>
            <Requirement>
                <Credential>
                    <ID>saveCredentials</ID>
                    <Type>savecredentials</Type>
                </Credential>
                <Label>
                    <Text>Remember my password</Text>
                    <Type>plain</Type>
                </Label>
                <Input>
                    <CheckBox>
                        <InitialValue>false</InitialValue>
                    </CheckBox>
                </Input>
            </Requirement>
            <Requirement>
                <Credential>
                    <ID>loginBtn</ID>
                    <Type>none</Type>
                </Credential>
                <Label>
                    <Type>none</Type>
                </Label>
                <Input>
                    <Button>Log On</Button>
                </Input>
            </Requirement>
        </Requirements>
    </AuthenticationRequirements>
</AuthenticateResponse>
<!--NeedCopy-->

引用

在 Azure 云中的 Server 2016、Citrix FAS 和 Azure MFA 上使用 AD FS 4.0 对 NetScaler 进行身份验证。(2018)。从 https://www.jgspiers.com/authentication-to-netscaler-using-ad-fs-4-0-server-2016-citrix-fas-azure-mfa-azure-cloud/ 中检索

将 Azure MFA 配置为使用 AD FS 的身份验证提供程序。(2019)。从 https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-ad-fs-and-azure-mfa 中检索

部署联合身份验证服务器场。(2017)。从 https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/deployment/deploying-a-federation-server-farm 中检索

联合身份验证服务 ADFS 部署。(2018)。从 https://docs.citrix.com/en-us/citrix-virtual-apps-desktops/secure/federated-authentication-service/fas-architectures/fas-adfs.html 中检索

将 NetScaler 部署为 Active Directory 联合身份验证服务代理的指南。(n.d.)。从 https://www.citrix.com/content/dam/citrix/en_us/documents/products-solutions/guide-to-deploying-netscaler-as-an-active-directory-federation-services-proxy.pdf 中检索

工作原理:Azure 多重身份验证。(2018)。从 https://docs.microsoft.com/en-us/azure/active-directory/authentication/concept-mfa-howitworks 中检索

规划基于云的 Azure 多重身份验证部署。(2019)。从 https://docs.microsoft.com/en-us/azure/active-directory/authentication/howto-mfa-getstarted 中检索

Tijl Van den Broeck。(Dec 7, 2017)。在 Windows Server 2012 R2 上使用 NetScaler 的 ADFS v3。从 https://www.citrix.com/blogs/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/ 中检索

使用 Citrix Gateway 过渡到混合云和 SaaS。(n.d.)。从 https://www.citrix.com/products/citrix-gateway/resources/netscaler-unified-gateway.html 中检索

用户使用 Azure Active Directory 直通身份验证登录。(2018)。从 https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta 中检索

由首席网络销售工程师 Saman Salehian 撰写。

Citrix Gateway 和 Microsoft Azure 多重身份验证