Azure Active Directory (Azure AD) のサインアウトページをカスタマイズするコードを紹介します。
概要
こちらの記事では、ASP.NET Coreアプリケーションで、Azure ADのアカウントで認証するプログラムを紹介しました。
このプログラムの中で、サインアウト後に、
(アプリケーションルートURL)/MicrosoftIdentity/Account/SignedOut
のページが表示されますが、
このページを変更したいことがあります。この記事では、サインアウト完了後のページを変更するコードを紹介します。
方針
ページの内容をカスタマイズする方法はいくつかありますが。
今回は実装が一番簡単な、
/MicrosoftIdentity/Account/SignedOut
ページのURLを書き換えてカスタマイズした別のページに差し替える方法を紹介します。
プログラム
コード
基本は
こちらの記事で紹介しているコードを同様です。
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();
@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>
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Authorization;
namespace AuthenticationAzureADCustomSignout.Pages
{
[AllowAnonymous]
public class IndexModel : PageModel
{
public void OnGet()
{
}
}
}
@page
@model AuthenticationAzureADCustomSignout.Pages.ContentModel
@{
}
<html>
<head>
</head>
<body>
<h1>コンテンツのページ</h1>
<p>コンテンツのページです</p>
<p>認証が必要なページです</p>
</body>
</html>
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Authorization;
namespace AuthenticationAzureADCustomSignout.Pages
{
[Authorize]
public class ContentModel : PageModel
{
public void OnGet()
{
}
}
}
@page
@model AuthenticationAzureADCustomSignout.Pages.MySignoutModel
@{
}
<html>
<head></head>
<body>
<p>サインアウトしました。</p>
</body>
</html>
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