チュートリアル: 外部テナントでの認証のために ASP.NET Core Web アプリを準備する

このチュートリアルは、ASP.NET Core Web アプリを構築し、それを Microsoft Entra 管理センターを使用する認証用に準備する方法を説明するシリーズのパート 2 です。 このシリーズのパート 1 では、外部テナントでアプリケーションを登録し、ユーザー フローを構成しました。 このチュートリアルでは、ASP.NET Core Web アプリを作成し、認証用に構成する方法について説明します。

このチュートリアルでは、次のことを行います。

  • Visual Studio Code で ASP.NET Core プロジェクトを作成する
  • 必要な NuGet パッケージを追加する
  • アプリケーションの設定を構成する
  • 認証を実装するコードを追加する

前提条件

ASP.NET Core プロジェクトを作成する

  1. Visual Studio Code を開き、[ファイル]>[フォルダーを開く...] の順に選択します。プロジェクトを作成する場所に移動して選択します。

  2. [ターミナル]>[新しいターミナル] を選択して、新しいターミナルを開きます。

  3. 次のコマンドを入力して、モデル ビュー コントローラー (MVC) ASP.NET Core プロジェクトを作成します。

    dotnet new mvc -n dotnetcore_webapp
    

ID パッケージをインストールする

ユーザーを認証するために、ID 関連の NuGet パッケージがプロジェクトにインストールされている必要があります。

  1. 次のコマンドを入力して dotnetcore_webapp フォルダーに変更し、次の関連する NuGet パッケージをインストールします。

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

認証用にアプリケーションを構成する

  1. appsettings.json ファイルを開き、既存のコードを次のスニペットに置き換えます。

    {
      "AzureAd": {
        "Authority": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/",
        "ClientId": "Enter_the_Application_Id_Here",
        "ClientCredentials": [
          {
            "SourceType": "ClientSecret",
            "ClientSecret": "Enter_the_Client_Secret_Here"
          }
        ],
        "CallbackPath": "/signin-oidc",
        "SignedOutCallbackPath": "/signout-callback-oidc"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
    • Authority - アプリの ID プロバイダー インスタンスとサインイン対象ユーザー。 Enter_the_Tenant_Subdomain_Here を外部テナントのサブドメインに置き換えます。 これを見つけるには、サイドバー メニューの [概要] を選択し、[概要] タブに切り替えます。caseyjensen.onmicrosoft.com 形式の [プライマリ ドメイン] を見つけます。 サブドメインは caseyjensen です。
    • ClientId - クライアントとも呼ばれる、アプリケーションの識別子。 引用符で囲まれた文字を、登録したアプリケーションの概要ページから先ほど記録した アプリケーション (クライアント) ID の値に置き換えます。
    • ClientSecret - テナントの準備に関するページで作成したクライアント シークレットの値。 引用符で囲まれたテキストを、Microsoft Entra 管理センターのクライアント シークレットのに置き換えます。
    • CallbackPath - サーバーが応答を適切なアプリケーションにリダイレクトするのに役立つ識別子です。
  2. 変更をファイルに保存します。

  3. Properties/launchSettings.json ファイルを開きます。

  4. profileshttps セクションで、https://localhost:7274 となるように applicationUrlhttps URL を変更します。 この URL を使用してリダイレクト URI を定義しました。

  5. 変更内容をファイルに保存します。

HomeController.cs に認可を追加する

HomeController.cs ファイルには、アプリケーションのホーム ページ用のコードが含まれており、ユーザーを認可する機能が必要です。 Microsoft.AspNetCore.Authorization 名前空間は、Web アプリに認可を実装するためのクラスとインターフェイスを提供し、[Authorize] 属性は、認証されたユーザーのみが Web アプリを使用できるように指定するために使用されます。

  1. コード エディターで、Controllers\HomeController.cs ファイルを開きます。

  2. 承認をコントローラーに追加する必要があり、Microsoft.AspNetCore.Authorization を追加して、ファイルの先頭が次のスニペットと同じになるようにします。

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  3. さらに、HomeController クラス定義のすぐ上に [Authorize] 属性を追加します。

    [Authorize]
    

Program.cs に認証と認可を追加する

Web アプリに認証と認可を追加するには、Program.cs を変更する必要があります。 これには、認証と認可のための名前空間の追加や、Microsoft ID プラットフォームを使用してユーザーをサインインできることが含まれます。

  1. 必要な名前空間を追加するには、Program.cs を開き、ファイルの先頭に次のスニペットを追加します。

    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc.Authorization;
    using Microsoft.Identity.Web;
    using Microsoft.Identity.Web.UI;
    using System.IdentityModel.Tokens.Jwt;
    
  2. 次に、認証サービスをアプリケーションに追加します。これにより、Web アプリはMicrosoft ID プラットフォームを使用してユーザーをサインインできるようになります。 Program.cs の残りのコードは、次のスニペットで置き換えることができます。

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.AddControllersWithViews();
    
    // This is required to be instantiated before the OpenIdConnectOptions starts getting configured.
    // By default, the claims mapping will map claim names in the old format to accommodate older SAML applications.
    // For instance, 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role' instead of 'roles' claim.
    // This flag ensures that the ClaimsIdentity claims collection will be built from the claims in the token
    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
    
    // Sign-in users with the Microsoft identity platform
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration)
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();
    
    builder.Services.AddControllersWithViews(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    }).AddMicrosoftIdentityUI();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    app.UseAuthorization();
    
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    
    

次のステップ