チュートリアル: 外部テナントでの認証のために 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 Web アプリを構築するために外部テナントを準備する。
- ASP.NET Core アプリケーションをサポートする統合開発環境 (IDE) ならどれでも使用できますが、このチュートリアルでは Visual Studio Code を使用します。 ダウンロードするにはこちらをクリックしてください。
- .NET 7.0 SDK。
ASP.NET Core プロジェクトを作成する
Visual Studio Code を開き、[ファイル]>[フォルダーを開く...] の順に選択します。プロジェクトを作成する場所に移動して選択します。
[ターミナル]>[新しいターミナル] を選択して、新しいターミナルを開きます。
次のコマンドを入力して、モデル ビュー コントローラー (MVC) ASP.NET Core プロジェクトを作成します。
dotnet new mvc -n dotnetcore_webapp
ID パッケージをインストールする
ユーザーを認証するために、ID 関連の NuGet パッケージがプロジェクトにインストールされている必要があります。
次のコマンドを入力して dotnetcore_webapp フォルダーに変更し、次の関連する NuGet パッケージをインストールします。
cd dotnetcore_webapp dotnet add package Microsoft.Identity.Web.UI
認証用にアプリケーションを構成する
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
- サーバーが応答を適切なアプリケーションにリダイレクトするのに役立つ識別子です。
変更をファイルに保存します。
Properties/launchSettings.json ファイルを開きます。
profiles
のhttps
セクションで、https://localhost:7274
となるようにapplicationUrl
のhttps
URL を変更します。 この URL を使用してリダイレクト URI を定義しました。変更内容をファイルに保存します。
カスタム URL ドメインを使用する (省略可能)
カスタム ドメインを使用して、認証 URL を完全にブランド化します。 ユーザーの視点から見ると、認証プロセスの間、ユーザーは ciamlogin.com ドメイン名にリダイレクトされず、あなたのドメインにとどまります。
カスタム ドメインを使用するには、次の手順に従います。
「外部テナントのアプリに対してカスタム URL ドメインを有効にする」の手順を実行して、外部テナントに対してカスタム URL ドメインを有効にします。
appsettings.json ファイルを開きます。
Authority
プロパティの値を https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here に更新します。Enter_the_Custom_Domain_Here
を実際のカスタム URL ドメインに、Enter_the_Tenant_ID_Here
を実際のテナント ID に置き換えます。 テナント ID がわからない場合は、テナントの詳細を読み取る方法を確認してください。- [Enter_the_Custom_Domain_Here] という値を持つ
knownAuthorities
プロパティを追加します。
カスタム URL ドメインが login.contoso.com、テナント ID が aaaabbbb-0000-cccc-1111-dddd2222eeee の場合、appsettings.json ファイルに変更を加えた後には、ファイルは次のスニペットのようになるはずです。
{
"AzureAd": {
"Authority": "https://login.contoso.com/aaaabbbb-0000-cccc-1111-dddd2222eeee",
"ClientId": "Enter_the_Application_Id_Here",
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret": "Enter_the_Client_Secret_Here"
}
],
"CallbackPath": "/signin-oidc",
"SignedOutCallbackPath": "/signout-callback-oidc",
"KnownAuthorities": ["login.contoso.com"]
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
HomeController.cs に認可を追加する
HomeController.cs ファイルには、アプリケーションのホーム ページ用のコードが含まれており、ユーザーを認可する機能が必要です。 Microsoft.AspNetCore.Authorization
名前空間は、Web アプリに認可を実装するためのクラスとインターフェイスを提供し、[Authorize]
属性は、認証されたユーザーのみが Web アプリを使用できるように指定するために使用されます。
コード エディターで、Controllers\HomeController.cs ファイルを開きます。
承認をコントローラーに追加する必要があり、
Microsoft.AspNetCore.Authorization
を追加して、ファイルの先頭が次のスニペットと同じになるようにします。using System.Diagnostics; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using dotnetcore_webapp.Models;
さらに、
HomeController
クラス定義のすぐ上に[Authorize]
属性を追加します。[Authorize]
Program.cs に認証と認可を追加する
Web アプリに認証と認可を追加するには、Program.cs を変更する必要があります。 これには、認証と認可のための名前空間の追加や、Microsoft ID プラットフォームを使用してユーザーをサインインできることが含まれます。
必要な名前空間を追加するには、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;
次に、認証サービスをアプリケーションに追加します。これにより、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();