ユーザーをサインインさせる Web アプリ:サインインとサインアウト

ユーザーをサインインさせる Web アプリのコードにサインインを追加する方法について学習します。 次に、ユーザーをサインアウトさせる方法について学習します。

サインイン

サインインは、次の 2 つの部分から構成されます。

  • HTML ページのサインイン ボタン
  • コントローラーの分離コードでのサインイン アクション

サインイン ボタン

ASP.NET Core では、Microsoft ID プラットフォーム アプリケーションの場合、 [サインイン] ボタンは Views\Shared\_LoginPartial.cshtml (MVC アプリの場合) または Pages\Shared\_LoginPartial.cshtm (Razor アプリの場合) 上に表示されます。 ユーザーが認証済みでない場合にのみ、表示されます。 つまり、ユーザーがまだサインインしていない場合やサインアウト済みの場合に表示されます。反対に、ユーザーが既にサインインしている場合は、 [サインアウト] ボタンが表示されます。 アカウント コントローラーは、MicrosoftIdentity という領域で、Microsoft.Identity.Web.UI NuGet パッケージ内に定義されていることに注意してください。

<ul class="navbar-nav">
  @if (User.Identity.IsAuthenticated)
  {
    <li class="nav-item">
        <span class="navbar-text text-dark">Hello @User.Identity.Name!</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>

コントローラーの SignIn アクション

ASP.NET では、Web アプリの [サインイン] ボタンを選択すると、AccountController コントローラーの SignIn アクションがトリガーされます。 以前のバージョンの ASP.NET Core テンプレートでは、Account コントローラーは Web アプリに埋め込まれていました。 現在では、コントローラーは Microsoft.Identity.Web.UI NuGet パッケージの一部になったため、これは当てはまらなくなりました。 詳細については、AccountController.cs を参照してください。

このコントローラーでは、Azure AD B2C アプリケーションも処理されます。

ユーザーがアプリにサインインした後、ユーザーがサインアウトできるようにすることが必要です。

サインアウト

Web アプリからのサインアウトに必要なのは、サインインしたアカウントに関する情報を Web アプリの状態から削除することだけではありません。 サインアウトするには、Web アプリによってユーザーが Microsoft ID プラットフォーム logout エンドポイントにリダイレクトされる必要もあります。

Web アプリによってユーザーが logout エンドポイントにリダイレクトされると、このエンドポイントでは、ユーザーのセッションがブラウザーから消去されます。 アプリが logout エンドポイントに移動しなかった場合、ユーザーは資格情報を再入力しなくてもアプリに再認証されます。 理由は、Microsoft ID プラットフォームとの有効なシングル サインイン セッションがあるからです。

詳細については、「Microsoft ID プラットフォームと OpenID Connect プロトコル」ドキュメントの「サインアウト要求を送信する」セクションを参照してください。

アプリケーションの登録

アプリケーションの登録時に、フロントチャネル ログアウト URL を登録します。 このチュートリアルでは、 [認証] ページの [Front-channel logout URL](フロントチャネル ログアウト URL) フィールドに https://localhost:44321/signout-oidc と登録しました。 詳細については、「webApp アプリを登録する」を参照してください。

サインアウト ボタン

ASP.NET では、Web アプリ上の [サインアウト] ボタンを選択すると、AccountController コントローラー上の SignOut アクションがトリガーされます (上記を参照)

<ul class="navbar-nav">
  @if (User.Identity.IsAuthenticated)
  {
    <li class="nav-item">
        <span class="navbar-text text-dark">Hello @User.Identity.Name!</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>

コントローラーの SignOut アクション

以前のバージョンの ASP.NET Core テンプレートでは、Account コントローラーは Web アプリに埋め込まれていました。 現在では、コントローラーは Microsoft.Identity.Web.UI NuGet パッケージの一部になったため、これは当てはまらなくなりました。 詳細については、AccountController.cs を参照してください。

  • Microsoft Entra ID でサインアウトが完了したときにコントローラーがコールバックされるように、OpenID リダイレクト URI を /Account/SignedOut に設定します。

  • OpenID Connect ミドルウェアで Microsoft ID プラットフォームの logout エンドポイントに連絡できるようにする Signout() を呼び出します。 その後、エンドポイントは次のことを行います。

    • ブラウザーからセッション Cookie を消去します。
    • ログアウト後のリダイレクト URI をコールバックします。 既定では、ログアウト後のリダイレクト URI によって、サインアウト済みビューのページ SignedOut.cshtml.cs が表示されます。 このページは、Microsoft.Identity.Web の一部としても提供されています。

logout エンドポイントへの呼び出しをインターセプトする

ログアウト後の URI により、アプリケーションはグローバル サインアウトに参加できるようになります。

ASP.NET Core OpenID Connect ミドルウェアでは、OnRedirectToIdentityProviderForSignOut という名前の OpenID Connect イベントを提供することで、お客様のアプリで Microsoft ID プラットフォーム logout エンドポイントへの呼び出しをインターセプトすることができます。 これは、Microsoft.Identity.Web によって自動的に処理されます (Web アプリによって Web API が呼び出される場合、アカウントはクリアされます)。

Protocol

サインアウトの詳細については、OpenID Connect から入手できるプロトコルのドキュメントを参照してください。

次のステップ