次の方法で共有


AD FS サインイン ページの高度なカスタマイズ

Windows Server 2012 R2 以降の Active Directory フェデレーション サービス (AD FS) では、ユーザー サインイン エクスペリエンスのカスタマイズがサポートされています。 ほとんどのシナリオでは、組み込みの Windows PowerShell コマンドレットを使用して AD FS サインイン ページを構成できます。 可能な限り、組み込みの Windows PowerShell コマンドを使用してカスタマイズすることをお勧めします。 詳細については、「 AD-FS ユーザー サインインのカスタマイズ」を参照してください。

場合によっては、AD FS に付属する PowerShell コマンドを使用して有効にできないサインイン エクスペリエンスを提供することが必要になる場合があります。 AD FS で提供される onload.js ファイルにカスタム コードを追加することで、サインイン エクスペリエンスを構成できます。 ファイル コードは、すべての AD FS ページで実行されます。

考慮 事項

AD FS サインイン ページのカスタマイズを開始する前に、次の重要な考慮事項を確認してください。

重要

リダイレクト フローに影響を与えたり、AD FS で使用されるプロトコル パラメーターを変更したりするカスタマイズの変更はサポートされていません。

  • onload.js ファイルは、フォーム ベースのサインイン ページ、ホーム領域検出ページなど、すべての AD FS ページで実行されます。 カスタム コードは常に意図したとおりにのみ実行され、予期せず実行されないようにしてください。

  • AD FS には、既定と呼ばれる組み込みの Web テーマが付属 しています。 既定の Web テーマを作成する onload.js コンテンツを変更することはできません。 onload.js ファイルを更新するには、AD FS サインイン ページ用のカスタム Web テーマを作成して使用します。 詳細については、「 AD-FS ユーザー サインインのカスタマイズ」を参照してください。

  • 既定の Web テーマの元の onload.js ファイルには、さまざまなフォーム ファクターのページレンダリングを処理するコードも含まれています。 推奨されるカスタマイズ方法は、既存の onload.js ファイルにカスタム ロジック コードを追加することです。 元の onload.js ファイルの内容は変更しないでください。

  • HTML 要素を参照する場合は、要素に対して動作する前に、常に要素の存在を確認してください。 この手順により堅牢性が提供され、この要素が含まれていないページでカスタム ロジックが実行されないようにします。 既存の HTML 要素を識別するには、AD FS サインイン ページで HTML ソースを表示します。

  • 別の環境でカスタマイズを検証し、運用環境の AD FS サーバーにカスタマイズを移動する前にテストを実行することをお勧めします。 この手順により、検証前にエンド ユーザーにカスタマイズを公開する可能性が低くなります。

カスタマイズ手順

次のセクションでは、AD FS サインイン ページの onload.js ファイルコンテンツをカスタマイズする手順について説明します。

カスタム Web テーマを作成する

onload.js ファイルにカスタム ロジックを追加するには、最初にカスタム Web テーマを作成します。 簡単な方法は、既定の Web テーマをエクスポートし、カスタマイズの基礎として元のコードを使用することです。

次のコマンドレットを実行して、既定の Web テーマを複製してカスタム Web テーマを作成します。

New-AdfsWebTheme –Name custom –SourceName default

onload.js ファイルを生成する

次の手順では、カスタム Web テーマをエクスポートして、更新できる onload.js ファイルを作成します。

次のコマンドレットを実行して、カスタム Web テーマをエクスポートし、onload.js ファイルを生成します。

Export-AdfsWebTheme –Name default –DirectoryPath c:\theme

onload.js ファイルは、コマンドレットで指定されたディレクトリ内の スクリプト フォルダーに配置されます。 この例では、指定したフォルダーが c:\themeされています。

カスタマイズの追加

これで、onload.js コンテンツを変更し、シナリオ用のカスタム ロジック コードを追加する準備ができました。 前述のように、onload.js ファイルの末尾にカスタム コードを追加してください。

一般的なカスタマイズを示すコード スニペットについては、次の のセクションを参照してください。

ターゲット onload.js ファイルを変更する

カスタマイズを追加したら、元の onload.js ファイルではなく、onload.js ファイルを使用するように AD FS Web テーマを更新する必要があります。

次のコマンドレットを実行して、onload.js ファイルを Web テーマ定義のターゲットとして設定します。

  • Windows Server 2016 以降の AD FS の場合:

    Set-AdfsWebTheme -TargetName custom -OnLoadScriptPath "c:\theme\script\onload.js"
    
  • Windows Server 2012 R2 の AD FS の場合:

    Set-AdfsWebTheme -TargetName custom -AdditionalFileResource @{Uri='/adfs/portal/script/onload.js';path="c:\theme\script\onload.js"}
    

AD FS にカスタマイズを適用する

最後の手順では、カスタマイズを AD FS サインイン ページに適用します。

次のコマンドレットを実行して、カスタマイズした AD FS を更新します。

Set-AdfsWebConfig -ActiveThemeName custom

例示

次の例では、AD FS サインイン ページを構成するために onload.js ファイルに追加できるカスタム コードを提供します。

常に、onload.js ファイルの末尾にカスタム コードを追加します。

サインイン ページのタイトル文字列を変更する

AD FS フォーム ベースのサインイン ページには、ユーザー入力フィールドの上にタイトルが表示されます。 既定のタイトル値は "組織のアカウントでサインイン" です。

onload.js ファイルに次のコードを追加して、既定の文字列値をカスタム文字列に置き換えます。 コードで、 loginMessage.innerHTML パラメーターの値を、タイトルに使用するカスタム文字列に設定します。

// Sample code to change page title string

// Check if loginMessage element is present
var loginMessage = document.getElementById('loginMessage');
if (loginMessage)
{
       // If loginMessage element is present, change title to custom value
       loginMessage.innerHTML = 'Custom title string value';
}

SAM アカウント名のサインインを受け入れる

AD FS フォーム ベースのサインイン ページでは、既定で 2 つのサインイン方法がサポートされています。

  • userPrincipalName": A user principal name (UPN), such as user@contoso.com`.
  • samAccountName: ドメイン修飾されたセキュリティ アカウント マネージャー (SAM) アカウント名 ( contoso\usercontoso.com\userなど)。

すべてのユーザーが同じドメインにいて、ユーザーが自分の SAM アカウント名のみを知っているシナリオを考えてみましょう。 ユーザーが SAM アカウント名のみを使用してサインインできるように、サインイン ページを更新できます。

次のコードを onload.js ファイルに追加することによってのみ、SAM アカウントからのサインインを有効にします。 コードで、 userNameValue パラメーターの値を目的のドメインに設定します。

// Sample code to enable user login from SAM account name only

if (typeof Login != 'undefined'){

    Login.submitLoginRequest = function () {
    
    var u = new InputUtil();
    var e = new LoginErrors();
    var userName = document.getElementById(Login.userNameInput);
    var password = document.getElementById(Login.passwordInput);

    // Update login method with desired ___domain value
    if (userName.value && !userName.value.match('[@\\\\]'))
    {
        var userNameValue = 'contoso.com\\' + userName.value;
        document.forms['loginForm'].UserName.value = userNameValue;
    }
    
    // Check for user name errors
    if (!userName.value) {
       u.setError(userName, e.userNameFormatError);
       return false;
    }

    // Check for password errors
    if (!password.value)
    {
        u.setError(password, e.passwordEmpty);
        return false;
    }

    // Update the form page 
    document.forms['loginForm'].submit();
    return false;
    };

}