ASP.NET Core の認証

技術情報
公開: 2022年05月13日

用語の整理

Authentication vs. Authorization(認証 vs. 承認)

認証(Authentication)は、ユーザーが本人の主張どおりの人物であることを確認します。
承認=認可(Authorization)は、そのユーザーにリソースへのアクセス許可を与えます。

認証承認(=認可) は別の概念であることに注意。 マイクロソフトのドキュメントでは、Authorization について承認と認可の両方の訳語が使用されているが、承認と認可はどちらも同じ意味を表している。

ASP.NET Core の認証(Authentication)

認証に Cookie を使用する場合の最小コード

// Program.cs
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        // ログイン画面のURL
        options.LoginPath = "/Login";
    });

・・・
var app = builder.Build();
・・・
app.UseAuthentication();

ASP.NET Core の承認(認可)

全てのアクションに認証を要求する

未承認(未ログイン)のユーザーはどのページにもアクセスできないようにする設定。

// Program.cs
builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

var app = builder.Build();
・・・
app.UseAuthentication();
app.UseAuthorization();

これは全てのコントローラー、Razor Pages に [Authorize] 属性を設定することと等価。
このままだとログイン画面にもアクセスできなくなるので、ログイン画面に [AllowAnonymous] を設定することで、未ログイン(未認証)状態でもログイン画面が表示されるようになる。

[AllowAnonymous]
public class LoginModel : PageModel

ロール ベースの承認

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
    public IActionResult Index() =>  Content("Administrator");
}
  • OR条件での承認
    カンマで区切るとOR条件となる。
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
    public IActionResult Payslip() =>
                    Content("HRManager || Finance");
}
  • AND条件での承認
    縦に並べるとAND条件となる。
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
    public IActionResult Index() =>
        Content("PowerUser && ControlPanelUser");
}

ポリシーベース、クレームベースの承認も同様だが

  • コントローラーの場合:コントローラー単位、アクション単位での承認が可能
  • Razor Pages の場合:Razor Pages 単位のみの承認が可能( アクション(ハンドラー)単位での承認は設定できない ) という制限があるため、Razor Pages で更新権限/参照権限のような切り分けを考える場合「更新機能は別ページとする」などの考慮が必要となる。

参考

ASP.NET Core の認証の概要
ASP.NET Core での認可の概要