Docsへ同様な記事を公開しました
https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-auto-acceleration-using-hrd
ADFSとフェデレーション環境において、SP Initiated SSOフローの際、Azure ADのログイン画面にユーザーID (UPN)を入力する必要があります。これはAzure ADがユーザーのテナントを特定するために必要なプロセスで、これをホームレルムディスカバリー (HRD) と呼びます。
ユーザーエクスペリエンスを向上させるため、このステップ (ユーザーがログインIDを入力する手間) を省く方法 (HRDアクセラレーション) が3つあります。
Azureポータルの、[エンタープライズアプリケーションブレード]より対象アプリケーションを選択、プロパティメニューの「ユーザーアクセスURL」にユーザーのドメイン情報を付加し、そのリンクをユーザーに利用してもらいます。
方法1:myapps.microsoft.com のスラッシュ(/)の後に対象ユーザーのUPNドメインを付加します。
https://myapps.microsoft.com/contoso.com/signin/AppName/2a354c93-d50f-47ed-b303-dc65f5af7a38
方法2:ユーザーアクセスURLのパラメーターとして、whr=[対象ユーザーのUPNドメイン]を付加します。
https://myapps.microsoft.com/signin/AppName/2a354c93-d50f-47ed-b303-dc65f5af7a38?whr=contoso.com
アプリケーションがIdentity ProviderであるAzure ADへ適切なパラメータを引渡すことで、HRDアクセラレーションが可能です。
Office 365やAzure ADアクセスパネルは、HRDアクセラレーションに対応しています。以下、contoso.com というUPNドメインが登録されている Azure AD テナントに対するHRDアクセラレーションの例です。
Outlook Web App
https://outlook.office.com/contoso.com
Azure AD アクセスパネル
https://myapps.microsoft.com/contoso.com
アプリケーションが対応している、もしくは改変で対応が可能であれば、同様にURLパラメータ等でHRDアクセラレーションが可能です。詳しくは、こちらのブログをご参考ください。
1に似ているのですが、SAMLに限ってSPの設定で指定するIdP(Azure ADのSAMLエンドポイント)にWHRパラメータ(whr=contoso.com)を追記することで、対象のAzure ADテナントへリダイレクトされます。
https://login.microsoftonline.com/23fbfc88-a7d3-49b0-9e68-3d6922aa9ac6/saml2?whr=contoso.com
こちらはYammerでの例ですが、汎用的に利用可能です。サンプルスクリプトも参考ください。
ADFS等とフェデレーションしているドメインに対してHRDアクセラレーションをする場合、アプリのサインオンURLに移動後、問答無用でADFSにリダイレクトされます。その場合、対象アプリにクラウドIDの利用者や、B2Bユーザー、また、別なADFSでログインするユーザーが居る場合にはこの手法は利用することが不可です。
# 必要に応じて
# Azure AD Previewモジュールのインストール・インポート(PowerShellを管理者権限で実行)
Install-Module -Name AzureADPreview -Force
Import-Module -Name AzureADPreview
# Login
Connect-AzureAD
########################################################################
# 設定
# ADFSへフェデレーションされているドメイン
$federatedDomain = "contoso.com"
# Azure ADのアプリケーション(Service Principal)の表示名(DisplayName)
$targetSPName = "Concur"
########################################################################
# Azure ADへ接続
Connect-AzureAD
# テナント上のポリシーの確認
Get-AzureAdPolicy | Where-Object {$_.Type -eq "HomeRealmDiscoveryPolicy"}
# ポリシーの作成
$newPolicy = New-AzureADPolicy -Definition @("{`"HomeRealmDiscoveryPolicy`":{`"AccelerateToFederatedDomain`":true,`"PreferredDomain`":`"$federatedDomain`"}}") -DisplayName BasicAutoAccelerationPolicy -Type HomeRealmDiscoveryPolicy -IsOrganizationDefault $false
# 作成されたポリシーの確認
Write-Host "New Policy Created"
Write-Host $newPolicy
# Getting Service Principal
# 対象アプリ(Service Principal)の取得
$targetSP = Get-AzureADServicePrincipal -SearchString $targetSPName
# 対象アプリ(Service Principal)の確認
Write-Host "Target Service Principal"
Write-host $targetSP
# Assigning Policy to Service Principal
# 作成したポリシーを対象アプリ(Service Principal)に適用
Add-AzureADServicePrincipalPolicy -Id $targetSP.ObjectId -RefObjectId $newPolicy.Id
# Confirm Policy mapping to Service Principal
# 対象アプリ(Service Principal)に適用されたポリシーを確認
Get-AzureADServicePrincipalPolicy -Id $targetSP.ObjectId
# Unlink Policy from ServicePrincipal
# ServicePrincipalへのポリシー適用を解除
#Remove-AzureADServicePrincipalPolicy -id $targetSP.ObjectId
# Delete policy
# ポリシーの削除
#Remove-AzureADPolicy -id $policyId