次の方法で共有


チュートリアル: 承認と認証のために ASP.NET Core Web アプリを構成する

適用対象: 白いチェック マークが付いた緑色の円。 従業員テナント緑 の円と白いチェック マーク記号。 外部テナント (詳細)

このチュートリアルでは、認証要素と承認要素を ASP.NET Core Web アプリに追加します。 前の チュートリアルでは、ASP.NET Core プロジェクトを作成し、認証用に構成しました。

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

  • 認可要素と認証要素をコードに追加する
  • ID トークンでの要求の表示を有効にする
  • サインインとサインアウトエクスペリエンスを追加する

[前提条件]

認証要素と承認要素を追加する

ASP.NET Core Web アプリに認証要素と承認要素を追加するには、HomeController.csファイルとProgram.cs ファイルを変更する必要があります。 これには、ホーム ページの管理、正しい名前空間の追加、サインインの構成が含まれます。

HomeController.cs に認可を追加する

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

  1. Web アプリで Controllers/HomeController.cs を開き、ファイルの先頭に次のスニペットを追加します。

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  2. 次のスニペットに示すように、[Authorize] クラス定義の上にHomeController属性を追加します。

    [Authorize]
    public class HomeController : Controller
    {
    ...
    

認証要素と承認要素をProgram.csに追加する

Program.cs ファイルはアプリケーションのエントリ ポイントであり、Web アプリに認証と承認を追加するように変更する必要があります。 認証に appsettings.jsonで定義 されている設定をアプリが使用できるようにするには、サービスを追加する必要があります。

  1. ファイルの先頭に次の名前空間を追加します。

    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. 次に、認証に Microsoft ID を使用するようにアプリを構成する Microsoft Identity Web アプリ認証サービスを追加します。

    // 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.
    // 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();
    
    
  3. 次に、認証機能を有効にするようにミドルウェアを構成する必要があります。 残りのコードを次のスニペットに置き換えます。

    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();
    

サインインとサインアウトエクスペリエンスを追加する

UI は、サインインとサインアウトのためのよりわかりやすいエクスペリエンスを提供するための更新プログラムである必要があります。このセクションでは、ユーザーの認証状態に基づいてナビゲーション項目を表示する新しいファイルを作成する方法を示します。 このコードでは ID トークン要求を読み取り、ユーザーが認証済みで、User.Claims を使用して ID トークン要求を抽出するかどうか確認します。

  1. Views/Shared で新しいファイルを作成し、_LoginPartial.cshtml という名前を付けます。

  2. ファイルを開き、サインインとサインアウトエクスペリエンスを追加するための次のコードを追加します。

    @using System.Security.Principal
    
    <ul class="navbar-nav">
    @if (User.Identity is not null && User.Identity.IsAuthenticated)
    {
            <li class="nav-item">
                <span class="nav-link text-dark">Hello @User.Claims.First(c => c.Type == "preferred_username").Value!</span>
            </li>
            <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>
    
  3. Views/Shared/_Layout.cshtml を開き、前の手順で作成した_LoginPartialへの参照を追加します。 次のスニペットに示すように、 navbar-nav クラスの末尾の近くに配置します。

    <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>
    

カスタム URL ドメインを使用する (省略可能)

適用対象: 灰色の X 記号が付いた白い円。 従業員テナント緑 の円と白いチェック マーク記号。 外部テナント (詳細)

カスタム ドメインを使用して、認証 URL を完全にブランド化します。 ユーザー視点では、認証プロセス中にユーザーはドメインに留まるため、ciamlogin.com ドメイン名にリダイレクトされません。

カスタム ドメインを使用するには、次の手順に従います。

  1. 「外部テナントのアプリのカスタム URL ドメインを有効にする」の手順に従って、外部テナントのカスタム URL ドメインを有効にします。

  2. appsettings.json ファイルを開きます。

    1. InstanceパラメーターとTenantId パラメーターを Authority プロパティに更新します。
    2. 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 がない場合は、 テナントの詳細を読み取る方法について説明します。
    3. knownAuthorities を持つ プロパティを追加します。

appsettings.json ファイルに変更を加えた後、カスタム URL ドメインが login.contoso.com で、テナント ID が aaaabbbb-0000-cccc-1111-dddd222eeee の場合、ファイルは次のスニペットのようになります。

{
  "AzureAd": {
    "Authority": "https://login.contoso.com/aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "ClientId": "Enter_the_Application_Id_Here",
    "ClientCertificates": [
      {
        "SourceType": "StoreWithThumbprint",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateThumbprint": "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"
      }   
    ],
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-callback-oidc",
    "KnownAuthorities": ["login.contoso.com"]
    ...

次のステップ