チュートリアル: 関数と Microsoft Graph を使用してカスタム ロールを割り当てる

この記事では、関数を使用して Microsoft Graph に対してクエリを実行し、Active Directory グループ メンバーシップに基づいてユーザーにカスタム ロールを割り当てる方法について説明します。

このチュートリアルで学習する内容は次のとおりです。

  • 静的 Web アプリをデプロイする。
  • Microsoft Entra アプリの登録を作成します。
  • Microsoft Entra ID を使ってカスタム認証を設定します。
  • ユーザーの Active Directory グループ メンバーシップに対するクエリを実行し、カスタム ロールの一覧を返すサーバーレス関数を構成します。

注意

このチュートリアルでは、関数を使用してロールを割り当てる必要があります。 関数ベースのロール管理は、現在プレビュー段階です。 このチュートリアルを完了するために必要なアクセス許可レベルは、"User.Read.All" です。

アプリの API には GetRoles という名前の関数があります。 この関数では、ユーザーのアクセス トークンを使用して、Microsoft Graph から Active Directory に対するクエリが実行されます。 ユーザーがアプリに定義されている任意のグループのメンバーである場合は、対応するカスタム ロールがユーザーにマップされます。

前提条件

要件 コメント
アクティブな Azure アカウント アカウントがない場合は、無料でアカウントを作成することができます。
Microsoft Entra アクセス許可 Microsoft Entra アプリケーションを作成できる十分なアクセス許可が必要です。

GitHub リポジトリを作成する

  1. ロール関数テンプレートに基づいてリポジトリを生成します。 新しいリポジトリを作成するために、次の場所に移動します。

    https://github.com/staticwebdev/roles-function/generate

  2. リポジトリに my-custom-roles-app という名前をつけます。

  3. [Create repository from template](テンプレートからリポジトリを作成する) を選択します。

静的 Web アプリを Azure にデプロイする

  1. 新しい Web ブラウザー ウィンドウで、Azure portal を開きます。

  2. 左上隅の [リソースの作成] を選択します。

  3. 検索ボックスに、「静的 Web アプリ」と入力します。

  4. Static Web Apps を選択します。

  5. [作成] を選択します

  6. 次の情報を使用して静的 Web アプリを構成します。

    設定 Notes
    サブスクリプション Azure サブスクリプションを選択します。
    Resource group my custom-roles-app-group という名前の新しいグループを作成します。
    名前 my-custom-roles-app
    プランの種類 Standard 認証のカスタマイズと関数を使用したロールの割り当てには、Standard プランが必要です。
    API のリージョン 最も近いリージョンを選択します。
  7. [デプロイの詳細] セクションで、以下のようにします。

    設定
    source [GitHub] を選択します。
    組織 リポジトリを生成した組織を選択します。
    リポジトリ my-custom-roles-app を選択します。
    [Branch]\(ブランチ) [main](メイン) を選択します。
  8. [ビルドの詳細] セクションで、このアプリの構成の詳細を追加します。

    設定 メモ
    ビルドのプリセット [カスタム] を選択します。
    アプリの場所 /frontend」と入力します。 このフォルダーには、フロントエンド アプリケーションが含まれています。
    API の場所 /api API 関数が含まれているリポジトリ内のフォルダー。
    Output location (出力場所) 空白のままにします。 このアプリにはビルド出力はありません。
  9. [Review + create](レビュー + 作成) を選択します。

  10. [作成] を択して、最初のデプロイを開始します。

  11. プロセスが完了したら、[リソースに移動] を選択して新しい静的 Web アプリを開きます。

  12. [概要] セクションで、アプリケーションの URL を見つけます。 この値をテキスト エディターにコピーし、Active Directory 認証を設定する今後の手順で使用します。

Microsoft Entra アプリケーションを作成する

  1. Azure portal で、[Microsoft Entra ID] を検索してそこに移動します。

  2. [管理] メニューから [アプリの登録] を選択します。

  3. [新規登録] を選択して、[アプリケーションの登録] ウィンドウを開きます。 次の値を入力します。

    設定 Notes
    名前 MyStaticWebApp」 と入力します。
    サポートされているアカウントの種類 [この組織のディレクトリ内のアカウントのみ] を選択します。
    リダイレクト URI [Web] を選び、静的 Web アプリの Microsoft Entra 認証コールバック URL を入力します。 <YOUR_SITE_URL>/.auth/login/aad/callback<YOUR_SITE_URL> は、静的 Web アプリの URL に置き換えます。 この URL は、前の手順でテキスト エディターにコピーしたものです。

    Create an app registration

  4. [登録] を選択します。

  5. アプリの登録が作成されたら、 [Essentials](要点) セクションの [アプリケーション (クライアント) ID][ディレクトリ (テナント) ID] をテキスト エディターにコピーします。

    これらの値は、静的 Web アプリで Active Directory 認証を構成するために必要です。

ID トークンを有効にする

  1. アプリの登録設定で、[管理][認証] を選択します。

  2. [暗黙的な許可およびハイブリッド フロー] セクションで [ID トークン (暗黙的およびハイブリッド フローに使用)] を選択します。

    Static Web Apps ランタイムでは、ユーザーを認証するためにこの構成が必要です。

  3. [保存] を選択します。

クライアント シークレットの作成

  1. アプリ登録の設定で、[管理] の下にある [証明書とシークレット] を選びます。

  2. [クライアント シークレット] セクションで、 [新しいクライアント シークレット] を選択します。

  3. [説明] フィールドに「MyStaticWebApp」と入力します。

  4. [有効期限] フィールドは、既定値の [6 か月] のままにします。

    注意

    有効期限が切れる前に、新しいシークレットを生成し、その値でアプリを更新して、シークレットをローテーションする必要があります。

  5. [追加] を選択します。

  6. 作成したクライアント シークレットの [値] をテキスト エディターにコピーします。

    この値は、静的 Web アプリで Active Directory 認証を構成するために必要です。

    Create a client secret

Active Directory 認証を構成する

  1. ブラウザーで、デプロイした静的 Web アプリが含まれた GitHub リポジトリを開きます。

    アプリの構成ファイル (frontend/staticwebapp.config.json) に移動します。 このファイルには次のセクションがあります。

    "auth": {
      "rolesSource": "/api/GetRoles",
      "identityProviders": {
        "azureActiveDirectory": {
          "userDetailsClaim": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",
          "registration": {
            "openIdIssuer": "https://login.microsoftonline.com/<YOUR_AAD_TENANT_ID>",
            "clientIdSettingName": "AAD_CLIENT_ID",
            "clientSecretSettingName": "AAD_CLIENT_SECRET"
          },
          "login": {
            "loginParameters": [
              "resource=https://graph.microsoft.com"
            ]
          }
        }
      }
    },
    

    この構成は、次の設定で構成されています。

    Properties 説明
    rolesSource ログイン プロセスが使用可能なロールの一覧を取得する URL。 サンプル アプリケーションの場合、URL は /api/GetRoles です。
    userDetailsClaim ログイン要求の検証に使用されるスキーマの URL。
    openIdIssuer テナント ID を追加した Microsoft Entra ログイン ルート。
    clientIdSettingName ご使用の Microsoft Entra クライアント ID。
    clientSecretSettingName Microsoft Entra クライアント シークレット値。
    loginParameters Microsoft Graph のアクセス トークンを取得するには、loginParameters フィールドが resource=https://graph.microsoft.com を使用して構成されている必要があります。
  2. ファイルを更新するために [編集] を選びます。

  3. <YOUR_AAD_TENANT_ID> を Microsoft Entra ID のディレクトリ (テナント) ID に置き換えて、https://login.microsoftonline.com/<YOUR_AAD_TENANT_ID>openIdIssuer 値を更新します。

  4. [変更をコミットする] を選択します。

  5. コミット メッセージを入力し、[変更をコミットする] を選択します。

    これらの変更をコミットすると、静的 Web アプリを更新する GitHub Actions の実行が開始されます。

  6. Azure portal で、お使いの静的 Web アプリ リソースに移動します。

  7. メニュー バーで [構成] を選択します。

  8. [アプリケーションの設定] セクションで、次の設定を追加します。

    名前
    AAD_CLIENT_ID Active Directory アプリケーション (クライアント) ID。
    AAD_CLIENT_SECRET Active Directory アプリケーションのクライアント シークレット値。
  9. [保存] を選択します。

ロールを作成する

  1. Azure portal で Active Directory アプリの登録を開きます。

  2. [管理] で、[アプリ ロール] を選択します。

  3. [アプリ ロールの作成] を選択し、次の値を入力します。

    設定
    表示名 admin」と入力します。
    Allowed member types (許可されるメンバーの種類) [ユーザー/グループ] を選択します。
    admin」と入力します。
    説明 Administrator」と入力します。
  4. [このアプリ ロールを有効にしますか?] チェック ボックスをオンにします。

  5. [適用] を選択します。

  6. 次に、reader という名前のロールに対して同じプロセスを繰り返します。

  7. 各ロールの ID 値をコピーし、テキスト エディターに保存します。

カスタム ロールを検証する

サンプル アプリケーションには、ユーザーが定義済みグループに含まれているかどうかを判断するために Microsoft Graph に対してクエリを実行する API 関数 (api/GetRoles/index.js) が含まれています。

ユーザーのグループ メンバーシップに基づき、関数によってカスタム ロールがユーザーに割り当てられます。 アプリケーションは、これらのカスタム ロールに基づいて特定のルートを制限するように構成されます。

  1. GitHub リポジトリで、api/GetRoles/index.js にある GetRoles 関数に移動します。

    上部には、カスタム ユーザー ロールを Microsoft Entra グループにマップする roleGroupMappings オブジェクトがあります。

  2. [編集] を選択します。

  3. Microsoft Entra テナントのグループ ID でオブジェクトを更新します。

    たとえば、6b0b2fff-53e9-4cff-914f-dd97a13bfbd6b6059db5-9cef-4b27-9434-bb793aa31805 の ID のグループがある場合は、次のようにオブジェクトを更新します。

    const roleGroupMappings = {
      'admin': '6b0b2fff-53e9-4cff-914f-dd97a13bfbd6',
      'reader': 'b6059db5-9cef-4b27-9434-bb793aa31805'
    };
    

    ユーザーが Microsoft Entra ID で正常に認証されるたびに GetRoles 関数が呼び出されます。 この関数では、ユーザーのアクセス トークンを使用して、Microsoft Graph から Active Directory グループ メンバーシップに対するクエリが実行されます。 ユーザーが roleGroupMappings オブジェクトに定義されている任意のグループのメンバーである場合は、対応するカスタム ロールが返されます。

    上の例では、ユーザーが b6059db5-9cef-4b27-9434-bb793aa31805 の ID を持つ Active Directory グループのメンバーである場合は、reader ロールが付与されます。

  4. [変更をコミットする] を選択します。

  5. コミット メッセージを追加し、[変更をコミットする] を選択します。

    これらの変更を行うと、静的 Web アプリを更新するためのビルドが開始されます。

  6. デプロイが完了したら、アプリの URL に移動して変更を確認できます。

  7. Microsoft Entra ID を使って静的 Web アプリにサインインします。

  8. ログインすると、ユーザーの ID の Active Directory グループ メンバーシップに基づいて、割り当てられているロール一覧がサンプル アプリに表示されます。

    これらのロールに応じて、アプリ内の一部のルートへのアクセスが許可または禁止されます。

Note

Microsoft Graph に対する一部のクエリでは、複数のページのデータが返されます。 複数のクエリ要求が必要な場合、Microsoft Graph は、結果の次のページへの URL を含む @odata.nextLink プロパティを応答で返します。 詳細については、アプリでの Microsoft Graph データのページングに関する記事を参照してください。

リソースをクリーンアップする

リソース グループを削除して、デプロイしたリソースをクリーンアップします。

  1. Azure portal で、左側のメニューから [リソース グループ] を選択します。

  2. [名前でフィルター] フィールドに、リソース グループ名を入力します。

  3. このチュートリアルで使用したリソース グループ名を選択します。

  4. トップ メニューから [リソース グループの削除] を選択します。

次のステップ