ユーザーをサインインさせる Web アプリ:コード構成

ユーザーをサインインさせる Web アプリのコードを構成する方法について説明します。

Web アプリをサポートしている Microsoft ライブラリ

次の Microsoft ライブラリは、Web アプリ (および Web API) を保護するために使用されます。

言語/フレームワーク プロジェクト
GitHub
Package 取得
started
ユーザーのサインイン Web API へのアクセス 一般提供 (GA) または
パブリック プレビュー1
.NET MSAL.NET Microsoft.Identity.Client ライブラリでは、ユーザー サインインの ID トークンを要求できません。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
.NET Microsoft.IdentityModel Microsoft.IdentityModel Library cannot request ID tokens for user sign-in.2 Library cannot request access tokens for protected web APIs.2 GA
ASP.NET Core ASP.NET Core Microsoft.AspNetCore.Authentication クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できません。 GA
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Java MSAL4J msal4j クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory チュートリアル ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Node.js MSAL Node msal-node クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Python MSAL Python msal ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 GA
Python identity identity クイックスタート ライブラリでは、ユーザー サインインの ID トークンを要求できます。 ライブラリでは、保護された Web API のアクセス トークンを要求できます。 --

(1)オンライン サービスのユニバーサル ライセンス条項は、"パブリック プレビュー" のライブラリに適用されます。

(2)Microsoft.IdentityModel ライブラリはトークンの "検証" のみを行います。ID やアクセス トークンを要求することはできません。

目的のプラットフォームに対応するタブを選択してください。

この記事および以下のコード スニペットは、ASP.NET Core Web アプリ増分チュートリアルの第 1 章から抜粋されています。

完全な実装の詳細については、このチュートリアルをご覧ください。

構成ファイル

Microsoft ID プラットフォームを使用してユーザーをサインインさせる Web アプリケーションは、構成ファイルを使用して構成します。 これらのファイルでは、次の値を指定する必要があります。

  • クラウド インスタンス (たとえば、アプリを国内のクラウドで実行する場合など)。 次のようなさまざまなオプションがあります。
    • https://login.microsoftonline.com/: Azure パブリック クラウドの場合
    • https://login.microsoftonline.us/: Azure US Government の場合
    • https://login.microsoftonline.de/: Microsoft Entra Germany の場合
    • https://login.partner.microsoftonline.cn/common: 21Vianet が運用する Microsoft Entra China の場合
  • テナント ID のオーディエンス。 オプションは、アプリがシングル テナントかマルチテナントかによって異なります。
    • Azure portal から取得したテナント GUID: 組織内のユーザーをサインインする場合。 ドメイン名も使用できます。
    • organizations: ユーザーを職場または学校のアカウントにサインインさせる場合
    • common: ユーザーを職場または学校のアカウント、あるいは Microsoft の個人用アカウントでサインインさせる場合
    • consumers: ユーザーを Microsoft の個人用アカウントでのみサインインさせる場合
  • Azure portal からコピーした、アプリケーションのクライアント ID

また、authority、すなわちインスタンステナント ID の値の連結への参照が表示される場合もあります。

ASP.NET Core では、これらの設定は appsettings.json ファイルの "Microsoft Entra ID" セクションにあります。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "[Enter the tenantId here]",

    // Client ID (application ID) obtained from the Azure portal
    "ClientId": "[Enter the Client Id here]",
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-oidc"
  }
}

ASP.NET Core では、別のファイル (properties\launchSettings.json) がアプリケーションの URL (applicationUrl) と TLS/SSL ポート (sslPort) およびさまざまなプロファイルを含んでいます。

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:3110/",
      "sslPort": 44321
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "webApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:3110/"
    }
  }
}

Azure portal では、アプリケーションの [認証] ページで登録するリダイレクト URI は、これらの URL と一致している必要があります。 前記の 2 つの構成ファイルについては、それは https://localhost:44321/signin-oidc です。 この理由は applicationUrlhttp://localhost:3110 である一方で、sslPort が指定されているためです (44321)。 CallbackPath は、appsettings.json で定義されているように /signin-oidc となります。

同様に、サインアウト URI は https://localhost:44321/signout-oidc に設定されます。

Note

SignedOutCallbackPath は、イベントの処理時の競合を回避するために、ポータルまたはアプリケーションに設定する必要があります。

初期化コード

初期化コードは、プラットフォームによって異なります。 ASP.NET Core と ASP.NET の場合、ユーザーのサインインは OpenID Connect ミドルウェアに委任されます。 ASP.NET または ASP.NET Core テンプレートを使用すると、Azure AD v1.0 エンドポイント用の Web アプリケーションが生成されます。 それを Microsoft ID プラットフォームに適合させるには、少し構成が必要です。

ASP.NET Core Web Apps (および Web API) では、コントローラーまたはコントローラー アクションでの Authorize 属性があるため、アプリケーションは保護されます。 この属性では、ユーザーが認証されていることが確認されます。 .NET 6 のリリースより前では、初期化コードは、Startup.cs ファイルにありました。 .NET 6 を使用する新しい ASP.NET Core プロジェクトには、Startup.cs ファイルは含まれません。 代わりに、Program.cs ファイルがあります。 このチュートリアルの残りの部分は、.NET 5 以下に関します。

注意

Microsoft.Identity.Web を活用する、Microsoft ID プラットフォーム用の新しい ASP.NET Core テンプレートを直接開始する場合は、.NET 5.0 用のプロジェクト テンプレートを含むプレビュー NuGet パッケージをダウンロードできます。 インストールが完了したら、ASP.NET Core Web アプリケーション (MVC または Blazor) を直接インスタンス化できます。 詳細については、Microsoft.Identity.Web Web アプリ プロジェクト テンプレートに関するページを参照してください。 以下のすべての手順をあなたの代わりに実行するため、これが最も簡単な方法です。

Visual Studio 内で現在の既定 ASP.NET Core Web プロジェクトを使用するか、dotnet new mvc --auth SingleOrg または dotnet new webapp --auth SingleOrg を使用してプロジェクトを開始すると、次のようなコードが表示されます。

 services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
         .AddAzureAD(options => Configuration.Bind("AzureAd", options));

このコードでは、Azure Active Directory v1.0 アプリケーションの作成に使用される従来の Microsoft.AspNetCore.Authentication.AzureAD.UI NuGet パッケージを使用します。 この記事では、そのコードに代わる Microsoft ID プラットフォーム v2.0 アプリケーションを作成する方法について説明します。

  1. Microsoft.Identity.Web および Microsoft.Identity.Web.UI NuGet パッケージをプロジェクトに追加します。 Microsoft.AspNetCore.Authentication.AzureAD.UI NuGet パッケージが存在する場合は削除します。

  2. AddMicrosoftIdentityWebApp メソッドと AddMicrosoftIdentityUI メソッドを使用するように ConfigureServices のコードを更新します。

    public class Startup
    {
     ...
     // This method gets called by the runtime. Use this method to add services to the container.
     public void ConfigureServices(IServiceCollection services)
     {
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
             .AddMicrosoftIdentityWebApp(Configuration, "AzureAd");
    
      services.AddRazorPages().AddMvcOptions(options =>
      {
       var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
       options.Filters.Add(new AuthorizeFilter(policy));
      }).AddMicrosoftIdentityUI();
    
  3. Startup.csConfigure メソッドで、app.UseAuthentication();app.MapControllers(); を呼び出して認証を有効にします。

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
     // more code here
     app.UseAuthentication();
     app.UseAuthorization();
    
     app.MapRazorPages();
     app.MapControllers();
     // more code here
    }
    

このコードでは:

  • AddMicrosoftIdentityWebApp 拡張メソッドは、Microsoft.Identity.Web で定義されています。これにより以下が行なわれます。

    • 構成ファイルを読み取るためのオプションが構成されます (ここでは、"Microsoft Entra ID" セクションから)。
    • 機関が Microsoft ID プラットフォームになるように OpenID Connect オプションが構成されます。
    • トークンの発行者が検証されます。
    • 名前に対応する要求が、ID トークンの preferred_username 要求からマップされるようにします。
  • 構成オブジェクトに加えて、AddMicrosoftIdentityWebApp を呼び出すときに構成セクションの名前を指定できます。 既定では、これは AzureAd です。

  • AddMicrosoftIdentityWebApp には、高度なシナリオのためのその他のパラメーターがあります。 たとえば、OpenID Connect ミドルウェア イベントをトレースすると、認証が機能しない場合の Web アプリケーションのトラブルシューティングに役立ちます。 省略可能なパラメーター subscribeToOpenIdConnectMiddlewareDiagnosticsEventstrue に設定すると、HTTP 応答から HttpContext.User 内のユーザーの ID への進行に合わせて、ASP.NET Core ミドルウェアのセットによって情報がどのように処理されるかが表示されます。

  • AddMicrosoftIdentityUI 拡張メソッドは、Microsoft.Identity.Web.UI に定義されています。 サインインおよびサインアウトを処理する既定のコントローラーが提供されます。

Microsoft.Identity.Web で Web アプリを作成する方法の詳細については、microsoft-identity-web の Web Apps に関するページを参照してください。

次のステップ

次の記事では、サインインとサインアウトをトリガーする方法について説明します。

このシナリオの次の記事であるサインインとサインアウトに関する記事に進みます。