Azure Active Directory (Azure AD) のサインアウトページをカスタマイズする - ASP.NET Core

Azure Active Directory (Azure AD) のサインアウトページをカスタマイズするコードを紹介します。

概要

こちらの記事では、ASP.NET Coreアプリケーションで、Azure ADのアカウントで認証するプログラムを紹介しました。 このプログラムの中で、サインアウト後に、(アプリケーションルートURL)/MicrosoftIdentity/Account/SignedOutのページが表示されますが、 このページを変更したいことがあります。この記事では、サインアウト完了後のページを変更するコードを紹介します。

方針

ページの内容をカスタマイズする方法はいくつかありますが。 今回は実装が一番簡単な、/MicrosoftIdentity/Account/SignedOut ページのURLを書き換えてカスタマイズした別のページに差し替える方法を紹介します。

プログラム

コード

基本はこちらの記事で紹介しているコードを同様です。
Program.cs
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.UI;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Rewrite;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd");
builder.Services.AddRazorPages().AddMvcOptions(options => {
  var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
  options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();

var app = builder.Build();

app.UseRewriter(
  new RewriteOptions().Add(
    context => {
      if (context.HttpContext.Request.Path == "/MicrosoftIdentity/Account/SignedOut") {
        context.HttpContext.Response.Redirect("/MySignout");
      }
    }));

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapControllers();
app.Run();
/Pages/Index.cshtml
@page
@model AuthenticationAzureADCustomSignout.Pages.IndexModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
}
<html>
  <head></head>
  <body>
    <h1>index</h1>
    <a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn">Sign In</a><br/>
    <a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Sign Out</a><br/>
    <a asp-page="/Content">Content</a><br/>
  </body>
</html>
/Pages/Index.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Authorization;


namespace AuthenticationAzureADCustomSignout.Pages
{
  [AllowAnonymous]
  public class IndexModel : PageModel
  {
    public void OnGet()
    {
    }
  }
}
/Pages/Content.cshtml
@page
@model AuthenticationAzureADCustomSignout.Pages.ContentModel
@{
}
<html>
  <head>

  </head>
  <body>
    <h1>コンテンツのページ</h1>
    <p>コンテンツのページです</p>
    <p>認証が必要なページです</p>
  </body>
</html>
/Pages/Content.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Authorization;

namespace AuthenticationAzureADCustomSignout.Pages
{
  [Authorize]
  public class ContentModel : PageModel
  {
    public void OnGet()
    {
    }
  }
}
/Pages/MySignout.cshtml
@page
@model AuthenticationAzureADCustomSignout.Pages.MySignoutModel
@{
}
<html>
  <head></head>
  <body>
    <p>サインアウトしました。</p>
  </body>
</html>
/Pages/MySignout.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Authorization;

namespace AuthenticationAzureADCustomSignout.Pages
{
  [AllowAnonymous]
  public class MySignoutModel : PageModel
  {
    public void OnGet()
    {
    }
  }
}

解説

Program.cs

下記コードが追加になっています。URL書き換え処理を追加し、"/MicrosoftIdentity/Account/SignedOut" のURLを "/MySignout" に書き換えています。 デフォルトでは、サインアウト後に、"/MicrosoftIdentity/Account/SignedOut" のURLにアクセスする動作ですが、この書き換え処理により、"/MySignout" のURLにアクセスします。
app.UseRewriter(
  new RewriteOptions().Add(
    context => {
      if (context.HttpContext.Request.Path == "/MicrosoftIdentity/Account/SignedOut") {
        context.HttpContext.Response.Redirect("/MySignout");
      }
    }));

MySignout.cshtml ページでは、ページモデルに[AllowAnonymous]を追加し認証不要なページとしています。 この設定がないと、認証が必要なページと判断され、すぐに認証画面が表示されてしまいます。
  [AllowAnonymous]
  public class MySignoutModel : PageModel
  {
    public void OnGet()
    {
    }
  }

実行結果

プロジェクトを実行します。サインイン後にサンアウトリンクをクリックします。
サインアウト画面が表示されるので、サインアウトします。



サインアウト後に、/MySignout のページが表示されます。


サインアウト画面をカスタマイズできました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-08-08
作成日: 2022-08-07
iPentec all rights reserverd.