ASP.NET Core での Azure Active Directory B2C を使用したクラウド認証

作成者: Damien Bod

Azure Active Directory B2C (Azure AD B2C) は、Web アプリとモバイル アプリのクラウド identity 管理ソリューションです。 このサービスには、クラウドとオンプレミスでホストされているアプリの認証が用意されています。 認証の種類には、個々のアカウント、ソーシャル ネットワーク アカウント、フェデレーション エンタープライズ アカウントがあります。 さらに、Azure AD B2C では、最小限の構成で多要素認証を使用できます。

ヒント

Microsoft Entra ID、Microsoft Entra 外部 ID、Azure AD B2C はそれぞれ個別の製品オファリングです。 Entra ID テナントが一般的に組織を表すのに対して、Azure AD B2C テナントまたは Microsoft Entra 外部 ID テナントは証明書利用者アプリケーションで使用される ID のコレクションを表すことができます。 詳細については、「Azure AD B2C: よく寄せられる質問 (FAQ)」を参照してください。

ヒント

顧客向け Microsoft Entra 外部 ID は、Microsoft の新しい顧客 identity とアクセス管理 (CIAM) ソリューションです。

このチュートリアルでは、Azure AD B2C を使用した認証のために ASP.NET Core アプリを構成する方法について説明します。

前提条件

準備

  1. Azure Active Directory B2C テナントを作成する

  2. 新しい ASP.NET Core Razor ページ アプリを作成します。

    dotnet new razor -o azure-ad-b2c
    

    このコマンドを使用して、azure-ad-b2c という名前のディレクトリに Razor ページ アプリを作成します。

    ヒント

    Visual Studio を使用してアプリを作成することもできます。

  3. テナントで Web アプリの登録を作成しますリダイレクト URI には、https://localhost:5001/signin-oidc を使用します。 Visual Studio によって生成されたポートを使用する場合は、5001 を、アプリで使用するポートに置き換えます。

アプリを変更する

  1. Microsoft.Identity.Web および Microsoft.Identity.Web.UI パッケージをプロジェクトに追加します。 Visual Studio を使用している場合は、NuGet パッケージ マネージャーを使用できます。

    dotnet add package Microsoft.Identity.Web
    dotnet add package Microsoft.Identity.Web.UI
    

    上記のコード:

    • Microsoft.Identity.Web には、Microsoft identity プラットフォームで認証を行うための依存関係の基本セットが含まれています。
    • Microsoft.Identity.Web.UI には、MicrosoftIdentity という名前の領域にカプセル化された UI 機能が含まれています。
  2. appsettings.jsonAzureADB2C オブジェクトを追加します。

    注意

    Azure B2C ユーザー フローを使用するときは、インスタンスとフローの種類の PolicyId を設定する必要があります。

    {
      "AzureADB2C": {
        "Instance": "https://--your-domain--.b2clogin.com",
        "Domain": "[Enter the domain of your B2C tenant, e.g. contoso.onmicrosoft.com]",
        "TenantId": "[Enter 'common', or 'organizations' or the Tenant Id (Obtained from the Azure portal. Select 'Endpoints' from the 'App registrations' blade and use the GUID in any of the URLs), e.g. da41245a5-11b3-996c-00a8-4d99re19f292]",
        "ClientId": "[Enter the Client Id (Application ID obtained from the Azure portal), e.g. ba74781c2-53c2-442a-97c2-3d60re42f403]",
        // Use either a secret or a certificate. ClientCertificates are recommended.
        "ClientSecret": "[Copy the client secret added to the app from the Azure portal]",
        "ClientCertificates": [
        ],
        // the following is required to handle Continuous Access Evaluation challenges
        "ClientCapabilities": [ "cp1" ],
        "CallbackPath": "/signin-oidc",
        // Add your policy here
        "SignUpSignInPolicyId": "B2C_1_signup_signin",
        "SignedOutCallbackPath": "/signout-callback-oidc"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "AllowedHosts": "*"
    }
    
    • Domain には、お使いの Azure AD B2C テナントのドメインを使用します。
    • ClientId には、お使いのテナントで作成したアプリ登録のアプリケーション (クライアント) ID を使用します。
    • Instance には、お使いの Azure AD B2C テナントのドメインを使用します。
    • SignUpSignInPolicyId には、Azure B2C テナントで定義されているユーザー フロー ポリシーを使用します。
    • ClientSecret または ClientCertificates のいずれかの構成を使用します。 ClientCertificates をお勧めします。
    • その他の値はそのままにします。
  3. Pages/Shared に、_LoginPartial.cshtml という名前のファイルを作成します。 次のコードを含めます。

    @using System.Security.Principal
    
    <ul class="navbar-nav">
    @if (User.Identity?.IsAuthenticated == true)
    {
            <span class="navbar-text text-dark">Hello @User.Identity?.Name!</span>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Sign out</a>
            </li>
    }
    else
    {
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn">Sign in</a>
            </li>
    }
    </ul>
    

    上記のコードでは次の操作が行われます。

    • ユーザーが認証されているかどうかを確認します。
    • 必要に応じてサインアウトまたはサインインのリンクをレンダリングします。
      • このリンクは、MicrosoftIdentity 領域内の Account コントローラーのアクション メソッドを指します。
  4. Pages/Shared/_Layout.cshtml で、強調表示されている行を <header> 要素内に追加します。

    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">azure_ad_b2c</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    

    <partial name="_LoginPartial" /> を追加すると、このレイアウトを使用するページ要求ごとに、_LoginPartial.cshtml の部分ビューがレンダリングされます。

  5. Program.cs で、次の変更を行います。

    1. 次の using ディレクティブを追加します。

      using Microsoft.Identity.Web;
      using Microsoft.Identity.Web.UI;
      using Microsoft.AspNetCore.Authentication.OpenIdConnect;
      

      上記のコードで、次の手順で使用する参照を解決します。

    2. builder.Services 行を次のコードで更新します。

      builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureADB2C"));
      
      builder.Services.AddAuthorization(options =>
      {
          // By default, all incoming requests will be authorized according to 
          // the default policy
          options.FallbackPolicy = options.DefaultPolicy;
      });
      builder.Services.AddRazorPages(options => {
          options.Conventions.AllowAnonymousToPage("/Index");
      })
      .AddMvcOptions(options => { })
      .AddMicrosoftIdentityUI();
      

      上のコードでは以下の操作が行われます。

      • AddAuthentication および AddMicrosoftIdentityWebApp メソッドを呼び出して、Open ID Connect を使用するようにアプリを構成します。具体的には、Microsoft identity プラットフォーム用に構成します。
      • AddAuthorization を使用して、ASP.NET Core 承認を初期化します。
      • AddRazorPages を呼び出して、匿名ブラウザーでインデックス ページを表示できるようにアプリを構成します。 他の要求はすべて認証が必要です。
      • AddMvcOptionsAddMicrosoftIdentityUI を使用して、Azure AD B2C との間のリダイレクトに必要な UI コンポーネントを追加します。
    3. 強調表示されている行を Configure メソッドに更新します。

      app.UseRouting();
      
      app.UseAuthentication();
      app.UseAuthorization();
      
      app.MapRazorPages();
      

      上記のコードにより、ASP.NET Core の認証が有効になります。

アプリを実行する

注意

Azure アプリ登録のリダイレクト URI と一致するプロファイルを使用します

  1. アプリを実行します。

    dotnet run --launch-profile https
    
  2. たとえば、アプリのセキュリティで保護されたエンドポイント https://localhost:5001/ を参照します。

    • このインデックス ページは、認証チャレンジが表示されずにレンダリングされます。
    • 認証されていないため、ヘッダーに サインイン リンクが含まれます。
  3. [Privacy](ログの一元化) リンクを選択します。

    • ブラウザーが、お使いのテナントで構成済みの認証方法にリダイレクトされます。
    • サインインすると、ヘッダーにウェルカム メッセージと サインアウト リンクが表示されます。

次のステップ

このチュートリアルでは、Azure AD B2C を使用した認証のために ASP.NET Core アプリを構成する方法について説明しました。

ASP.NET Core アプリを Azure AD B2C を使用して認証を行うように構成したので、Authorize 属性を使用してアプリをセキュリティで保護することができます。 アプリの開発を続けるには、次の内容を学習します。