高度な概念

Citrix GatewayとMicrosoft Azureの多要素認証

Citrix Gateway は、ホストされているすべてのアプリケーション、SaaS、Web アプリケーション、エンタープライズアプリケーション、モバイルアプリケーションを、あらゆるデバイスやブラウザーのユーザーに提供します。nFactor 認証を使用して、オンプレミスの Microsoft AD に対してユーザーを認証し、Azure 多要素認証 (MFA) に Microsoft AD FS を活用します。

概要

Citrix Gateway

Citrix Gateway では、データセンターやクラウドに展開されたビジネスアプリケーションやデータに対して、1つのアクセスポイントとシングルサインオン(SSO)をユーザーに提供します。ノートパソコン、デスクトップ、シンクライアント、タブレット、スマートフォンなど、さまざまなデバイスで SaaS として提供されます。Citrix Gateway は、統合、リモートアクセスインフラストラクチャの設置面積の削減、コストの削減、管理の容易さ、エンドユーザーエクスペリエンスの向上を実現します。Citrix Gateway は、ITをハイブリッドクラウドおよびSaaS環境に移行するのに役立ちます。

  • フェデレーションとシングルサインオン

Citrix Gateway はフェデレーティッドアイデンティティを提供し、SAML 2.0、OAuth、OpenIDをサポートしているため、Web、VDI、エンタープライズ、SaaSアプリケーションなど、すべてのアプリケーションでシングルサインオンを実現します。

  • オンプレミスのユーザーディレクトリ

Citrix Gateway は、Office 365やSalesforceなどのSaaSアプリケーションに対してSSOを提供し、ユーザーディレクトリをオンプレミスで保持します。これは、Active Directory フェデレーションサービス (AD FS) の IdP またはプロキシとして実装できます。

  • 多要素(nFactor)認証

Citrix Gateway は、nFactor認証メカニズムを提供し、ネットワークにアクセスするユーザー、アクセス内容、アクセス方法とアクセス時期をきめ細かく制御できます。これは、このようなRADIUS、タカス、NTLM、直径、SAML 2.0、OAuth 2.0、およびOpenID 2.0などのすべての認証メカニズムをサポートしています。

  • コンテキストアクセスコントロールポリシー

Citrix Gateway では、エンドユーザーデバイス、ユーザー、ユーザーの場所などのデータの状態に基づいて、ビジネスアプリケーションへのきめ細かいアクセス制御が可能です。IT 管理者は、アプリケーション環境でデータに安全にアクセスするためのポリシーを作成、管理、および適用できます。これらのポリシーは、VDI、Web、モバイル、エンタープライズ、SaaS アプリケーションに対して実装できます。

  • 可視性とモニタリング

Citrix Application Delivery Management には、Citrix Gatewayを介してアクセスされるすべてのアプリケーションのエンドツーエンドのユーザーエクスペリエンスを可視化するためのゲートウェイインサイトが含まれています。EPA チェックの失敗やシングルサインオンの失敗など、認証の失敗に関する問題のトラブルシューティングを行うために、アプリケーションサポートチームが情報を提供します。

アプリケーション

サポートされているアプリ

Microsoft Azure MFA

人々はますます複雑化するシナリオで、組織のリソースに接続しています。企業は、スマートフォン、タブレット、PC、ラップトップを使用して、企業ネットワーク内外で、組織所有のデバイス、個人用デバイス、公共デバイスから接続できます。多くの場合、複数のプラットフォームを使用します。この常時接続、マルチデバイス、マルチプラットフォームの世界では、ユーザーアカウントのセキュリティがこれまで以上に重要になっています。デバイス、ネットワーク、プラットフォーム間で使用されるパスワードは、複雑さに関係なく、ユーザーアカウントのセキュリティを確保するのに十分ではありません。特に、ユーザーがアカウント間でパスワードを再利用する傾向がある場合は特にそうです。高度なフィッシングやその他のソーシャルエンジニアリング攻撃により、暗い Web 上でユーザー名とパスワードが投稿され、販売される可能性があります。

2段階検証プロセスのセキュリティは、階層化されたアプローチにあります。複数の認証要素が侵害されることは、攻撃者にとって大きな課題となります。攻撃者がユーザーのパスワードを習得しても、追加の認証方法を所有することなく役に立たない。これは、次の認証方法の2つ以上を要求することによって機能します。

  • あなたが知っているもの(通常はパスワード)
  • あなたが持っているもの(電話のように簡単に複製できない信頼できるデバイス)
  • あなたが何か(生体認証)

Azure 多要素認証は、データとアプリケーションへのアクセスを保護するのに役立ちます。これは、認証の第二の形式を使用して、セキュリティの余分な層を提供します。組織は、条件付きアクセスを使用して、ソリューションを特定のニーズに合わせることができます。

Microsoft Azure MFAの展開方法

Azure MFA を認証の 2 番目の要素として活用するには、さまざまな方法があります。そのような方法は、以下の長所と短所で簡単に説明する。

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 条件付きアクセスポリシーと互換性がありません。条件付きアクセスポリシーは、より豊かで優れたユーザーエクスペリエンスを提供します。
  • ユーザーは、NPS アダプターを使用する前に MFA に登録する必要があります。Azure MFA クラウドベースおよび条件付きアクセスとは異なり、ユーザーが登録されていない場合、NPS Extension はユーザーの認証に失敗し、ヘルプデスクへの呼び出しが増えます。
  • NPS アダプターが MFA を起動すると、ユーザーが登録したデフォルトオプションにヒットします。ユーザーには、MFA が必要であり、これから来るという視覚的な通知はありません。ゲート処理中にユーザーが MFA メソッドを変更するための UI はありません。ユーザーがデフォルトのデバイスを持っていない場合、失敗します。ユーザーは、セルフサービスポータルに戻り、デフォルトオプションをリセットしてから、もう一度接続を試みる必要があります。

Microsoft AD FSとAzure MFA

組織が Azure AD とフェデレートされているが、パスワードハッシュが Azure AD と同期されていない場合は、オンプレミス AD for ライトウェイトディレクトリアクセスプロトコル (LDAP) を使用し、AD FS のリレーパーティのアクセスポリシーの一部として Azure MFA を有効にできます。Windows Server 2016以降、プライマリ認証用に Azure MFA を構成できるようになりました。

  • Azure MFA アダプターは Windows Server 2016 に組み込まれており、追加のインストールは必要ありません。
  • Azure MFA アダプターは Azure AD と直接統合され、オンプレミスの Azure MFA サーバーは必要ありません。
  • ユーザーが MFA に登録されていない場合は、次回のサインイン時にプロセスを案内します。これにより、ヘルプデスクへの呼び出しが少なくなり、ユーザーにとってより良いプロセスが実現されます。
  • ユーザーは、MFA が必要であり、今後予定されているという視覚的な通知を受け取ります。ユーザーは、UI のゲート処理中にGateway オプションを変更できます。

Azure ADとAzure MFA

組織がパスワードハッシュを Azure AD に同期している場合は、条件付きアクセスポリシーによって Azure MFA を活用して、ユーザーに第 2 要素認証をチャレンジできます。

  • この方法では、オンプレミスで追加のインストールは必要ありません。
  • ユーザーが MFA に登録されていない場合は、次回のサインイン時にプロセスを案内します。これにより、ヘルプデスクへの呼び出しが少なくなり、ユーザーにとってより良いプロセスが実現されます。
  • ユーザーは、MFA が必要であり、今後予定されているという視覚的な通知を受け取ります。ユーザーは、UI のゲート処理中にGateway オプションを変更できます。

Azure AD パススルー認証と Azure MFA

Azure AD パススルー認証 (PTA) を使用すると、ユーザーは同じパスワードを使用して、オンプレミスアプリケーションとクラウドベースの両方のアプリケーションにサインインできます。ユーザーが Azure AD を使用してサインインすると、この機能はユーザーのパスワードをオンプレミスの Active Directory に対して直接検証します。Azure AD PTA は、Azure AD パスワードハッシュ同期の代替手段であり、組織にクラウド認証の同じ利点を提供します。

  • Azure AD PTA では、軽量エージェントをオンプレミスにインストールする必要があります。
  • Azure AD PTA は、Azure MFA を含む Azure AD 条件付きアクセスポリシーとシームレスに連携することで、ユーザーアカウントを保護します。
  • ユーザーは、セルフサービスのパスワード管理タスクをクラウドで完了できます。
  • オンプレミスのパスワードは、どのような形式でもクラウドに保存されることはありません。
  • エージェントは、ネットワーク内からのみアウトバウンド接続を行います。したがって、境界ネットワーク (DMZ とも呼ばれる) にエージェントをインストールする必要はありません。

現在の状況

次の特性を持つ環境では、認証の 2 番目の要素として Azure MFA を活用する必要があります。

  • Azure AD 同期を使用するオンプレミス AD が構成されています。
  • Azure AD パスワードハッシュ同期が無効になっています。
  • O365 アプリケーションへのアクセスが必要です。
  • Citrix Virtual Apps and Desktops をオンプレミスでアクセスする必要があります。
  • 最新の認証方法(SAML、OAuth)を使用したアプリケーションへのアクセスが必要です。
  • レガシー認証方式を使用するアプリケーションへのアクセスが必要です。

設計点

提案されたソリューションの設計ポイントは次のとおりです。

  • ホスト型アプリケーション、SaaS アプリケーション、エンタープライズアプリケーション、Web アプリケーションを 1 つのポータルで安全にアクセスする必要があります。
  • ユーザーは、認証プロセス中に 1 回だけ資格情報を入力する必要があります。
  • シングルサインオンは、ホスト型、SaaS 型、エンタープライズ、Web アプリケーションすべてに提供する必要があります。

提案するソリューション

概要

提案されたソリューションは、次のコンポーネントに基づいています。

  • オンプレミスの Citrix Gateway
  • オンプレミス Microsoft AD
  • オンプレミスの AD FS
  • AD FS プロキシとしてのオンプレミスの Citrix ADC
  • Microsoft Azure MFA

Citrix Gateway では、認証、承認、監査機能 (Citrix ADC AAA) および nFactor 認証メカニズムを利用して、LDAP ポリシーを使用してユーザーを認証し、AD FS リレーパーティのアクセスポリシーを利用して Azure MFA 検証プロセスをトリガーします。Azure MFA がユーザーを検証した後、AD FS は SAML アサーション (SAML 応答) を生成し、ユーザーを Citrix Gateway にリダイレクトします。この時点で、ユーザーは認証され、Citrix Gateway はそのユーザーが使用を許可されているすべてのアプリケーションを表示します。

このソリューションには、2 つのパブリック DNS レコードと 2 つのパブリック IP アドレスが必要です。

説明
Citrix Gateway FQDN access.ctxdemos.com
Citrix の認証、承認、および監査FQDNの aaa.ctxdemos.com

このソリューションでは、1 つのパブリック 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. 最初の認証ポリシーは、認証クッキーを生成するために、アドレス指定できない LB VIP への SAML SP です。
  5. ヘルパー LB VIP は、認証に 2 番目の Citrix ADC AAA VIP(アドレス可能)を使用するように構成されています。したがって、ユーザは 2 番目の認証、認可、および監査 VIP にリダイレクトされます。
  6. 2つ目の Citrix ADC AAA VIP は、ユーザー名の入力を求めるUsername Onlyログオンスキーマを使用します。次に、高度な認証ポリシーの処理を開始します。
  7. 最初の認証ポリシーは、オンプレミス AD でユーザー名を照会し、ユーザーが AzureMFACAUsers セキュリティグループに属しているかどうかを検証するグループの抽出です。検証結果が成功すると、次の認証要素(LDAP ポリシー)の処理が開始されます。
  8. LDAP ポリシーは、UsernameAndPasswordログインスキーマと事前に入力されたユーザー名フィールドを使用して、AD パスワードの入力をユーザーに要求します。
  9. 2 つ目の Citrix ADC AAA VIP での認証が正常に完了すると、ヘルパー LB VIP に戻り、最初の認証、承認、および監査 VIP の SAML 応答を生成します。
  10. 最初のCitrix ADC AAA VIPは、次の要素を処理します。これは、ユーザーのグループがADから抽出され、認証変数、承認変数、監査変数に格納され、プロセスの後で使用されるようにするためのグループ抽出です。
  11. まず、Citrix ADC AAA VIP は、次の要因の処理を開始します。これは、Citrix ADC 上の AD FS プロキシ VIP への SAML SP です。

    注:

    Citrix ADC は AD FS ファームとフェデレートされます。詳細な手順については、後のセクションで説明します。

  12. AD FS プロキシ VIP は、認証クッキー (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

証明書の要件

フェデレーションサーバーには、次の表に示す証明書が必要です。

証明書の種類 説明 展開する前に知る必要があること
Secure Sockets Layer (SSL) 証明書 これは、フェデレーションサーバーとクライアント間の通信をセキュリティで保護するために使用される標準のセキュアソケットレイヤー (SSL) 証明書です。 この証明書は、フェデレーションサーバーまたはフェデレーションサーバープロキシのインターネットインフォメーションサービス (IIS) の既定の Web サイトにバインドする必要があります。フェデレーションサーバープロキシの場合、フェデレーションサーバープロキシ構成ウィザードを正常に実行する前に、IIS でバインドを構成する必要があります。推奨事項:この証明書は AD FS のクライアントによって信頼される必要があるため、パブリック (サードパーティ) 証明機関 (CA) によって発行されたサーバー認証証明書を使用します。たとえば、ベリサイン。ヒント:この証明書のサブジェクト名は、展開する AD FS の各インスタンスのフェデレーションサービス名を表すために使用されます。このため、パートナーにとって会社または組織の名前を最もよく表す新しい CA 発行の証明書で、サブジェクト名を選択することを検討してください。
サービス通信証明書 この証明書により、フェデレーションサーバー間の通信をセキュリティで保護するための WCF メッセージセキュリティが有効になります。 デフォルトでは、SSL 証明書がサービス通信証明書として使用されます。これは、AD FS 管理コンソールを使用して変更できます。
トークン署名証明書 これは、フェデレーションサーバーが発行するすべてのトークンに安全に署名するために使用される標準の X509 証明書です。 トークン署名証明書には秘密キーが含まれていなければならず、フェデレーションサービスの信頼されたルートにチェーンする必要があります。既定では、AD FS は自己署名証明書を作成します。ただし、組織のニーズに応じて、AD FS の管理スナップインを使用して、後で CA 発行の証明書に変更できます。
トークン暗号化解除証明書 これは、パートナーフェデレーションサーバーによって暗号化された受信トークンの復号化に使用される標準 SSL 証明書です。また、フェデレーションメタデータにも公開されます。 既定では、AD FS は自己署名証明書を作成します。ただし、組織のニーズに応じて、AD FS の管理スナップインを使用して、後で CA 発行の証明書に変更できます。

デモ環境の構成

証明書のタイプ デモ環境の構成
Secure Sockets Layer (SSL) 証明書 AD FS サーバー上の内部発行 CA によって発行された内部証明書。Citrix ADC上の信頼できる公開証明書。
サービス通信証明書 AHS 内部発行認証局によって発行された内部証明書。
トークン署名証明書 AD FS サービスによって自動生成されます。
トークン暗号化解除証明書 AD FS サービスによって自動生成されます。

デモ環境では、ワイルドカード証明書が登録され、サーバーにインストールされます。

認証局

サービスアカウントの要件

サービスアカウントを作成するか、グループマネージドサービスアカウント (gMSA) を活用できます。gMSAを使用するには、キー配布サービスのルートキーを作成する必要があります。したがって、PowerShell を起動し、次のコマンドを実行します。

Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))

このコマンドは、Active Directory に格納されたキー配布サービスのルートキーを作成します。これにより、後で作成する AD FS サービスアカウントとして、グループ管理サービスアカウント (gMSA) を作成できます。ドメイン管理者権限でこのコマンドを実行します。

ルートキー

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

PowerShell

AD FS ファームを構成する

これで、 サーバーマネージャーからAD FSの展開後の構成を開始できます。[このサーバーでフェデレーションサービスを構成する] をクリックします。

展開後の構成

[ようこそ] ページで、 [フェデレーションサーバーファームに最初のフェデレーションサーバーを作成する] を選択し、[次へ] をクリックします。

最初のフェデレーションサーバーを作成する

[Active Directory ドメインサービスへの接続] ページで、ドメイン管理者アカウントが指定されていることを確認し、[次へ] をクリックします。

Active Directory ドメインサービスに接続する

[サービスのプロパティの指定] ページで、次の手順を完了し、[次へ] をクリックします。

  • 前の手順でサーバーにインストールされた証明書を選択します。
  • フェデレーションサービス名は、証明書のサブジェクト名に基づいて自動的に設定されます。
  • フェデレーションサービスの表示名を入力します。たとえば、「CTXDEMOS STS」などです。

サービスプロパティの指定

[サービスアカウントの指定] ページで、[グループ管理サービスアカウントの作成] を選択し、このアカウントの一意の名前を入力します。グループマネージドサービスアカウントは、Windows Server 2012 以降でサポートされており、30 日ごとに自動的に変更される厳密な複雑なパスワードが付属しています。[次へ] をクリックします。

グループ管理サービスアカウントを作成する

[構成データベースの指定] ページで、SQL Server データベースの場所を指定します。[次へ] をクリックします。

構成データベースの指定

[確認オプション] ページで、構成の選択を確認し 、[次へ] をクリックします。

レビューオプション

[前提条件のチェック] ページで、すべての前提条件のチェックが正常に完了していることを確認し、[構成] をクリックします。

前提条件のチェック

[結果] ページで、インストールが正常に完了していることを確認します。[閉じる]をクリックしてウィザードを終了します。

展開後の構成結果

注:次の手順を完了

するには、Azure テナント ID が必要です。

Azure テナント ID を取得するには、Microsoftのドキュメント記事「AzureID テナントの詳細を取得する」の手順に従います 。

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

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

AD FS ファームを構成する

AD FS サーバーの 1 つだけで、次のコマンドを実行します。

Set-AdfsAzureMfaTenant -TenantId $azureTenantID -ClientId $azureMFAClientGUID

各サーバーで 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");

ルールを構成する

クレーム発行ポリシーが作成されたら、[OK] をクリックします。

[証明書利用者の信頼] > [Citrix ADC] を右クリックし、[プロパティ] を選択します。[エンドポイント] を選択し、[ログアウト用の SAML を追加] をクリックしてエンドポイントを追加します。[エンドポイントタイプ] リストから [SAML ログアウト] を選択します。[バインド] で [POST] を選択し、[信頼済み URL] にhttps://sts.ctxdemos.com/adfs/ls/?wa=wsignout1.0と入力します。これは、Citrix ADCからログアウトするときのログアウトURLとして機能します。[OK] をクリックします。

SAML ログアウト

[証明書利用者の信頼] > [Citrix ADC] を右クリックし、[プロパティ] を選択します。[ 暗号化 ]を選択し、Citrix Gateway にインストールされているパブリックSSL証明書を追加します。この証明書は、Citrix ADCからの受信SMLリクエストの復号化に使用されます。[署名] タブでも同じ操作を繰り返します。この証明書は、着信 SAML リクエストの署名を確認するために使用されます。[OK] をクリックします。

IdP 開始サインオンページの有効化

AD FS IdP が開始するサインオンページを有効にできます。IdP が開始したサインオンを使用して、未登録の MFA ユーザーにカスタムエラーページを表示します。有効にするには、次のコマンドを実行します。

Set-AdfsProperties -EnableIdPInitiatedSignonPage $true

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 ドメインセキュアチケットオーソリティの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

最初の認証サーバーの構成

# 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

2 番目の認証サーバーを構成する

# 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

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

初期認証フローの設定

# 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

暗号グループ

# 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

ログインスキーマ 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>

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>

参考資料

Authentication to NetScaler using AD FS 4.0 on Server 2016, Citrix FAS, and Azure MFA in Azure Cloud. (2018). Retrieved from https://www.jgspiers.com/authentication-to-netscaler-using-ad-fs-4-0-server-2016-citrix-fas-azure-mfa-azure-cloud/

Configure Azure MFA as authentication provider with AD FS. (2019). Retrieved from https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/configure-ad-fs-and-azure-mfa

Deploying a Federation Server Farm. (2017). Retrieved from https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/deployment/deploying-a-federation-server-farm

Federated Authentication Service ADFS deployment. (2018). Retrieved from https://docs.citrix.com/ja-jp/citrix-virtual-apps-desktops/secure/federated-authentication-service/fas-architectures/fas-adfs.html

Guide to deploying NetScaler as an Active Directory Federation Services Proxy. (n.d.). Retrieved from https://www.citrix.com/content/dam/citrix/en_us/documents/products-solutions/guide-to-deploying-netscaler-as-an-active-directory-federation-services-proxy.pdf

How it works: Azure Multi-Factor Authentication. (2018). Retrieved from https://docs.microsoft.com/en-us/azure/active-directory/authentication/concept-mfa-howitworks

Planning a cloud-based Azure Multi-Factor Authentication deployment. (2019). Retrieved from https://docs.microsoft.com/en-us/azure/active-directory/authentication/howto-mfa-getstarted

Tijl Van den Broeck. (Dec 7, 2017). ADFS v3 on Windows Server 2012 R2 with NetScaler. Retrieved from https://www.citrix.com/blogs/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/

Transition to hybrid cloud and SaaS with Citrix Gateway. (n.d.). Retrieved from https://www.citrix.com/products/citrix-gateway/resources/netscaler-unified-gateway.html

User sign-in with Azure Active Directory Pass-through Authentication. (2018). Retrieved from https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta

Written by Saman Salehian, Lead Networking Sales Engineer.

Citrix GatewayとMicrosoft Azureの多要素認証