【.Net】IdentityServer 4の構築メモ【備忘録】

2021年6月12日

はじめに

IdentityServer3で実装していた認証基盤をIdentityServer4にバージョンアップするときに気をつける変更点や、つまずいた点を備忘録としてまとめておきます。

IdentityServerとは

  • IdentityServerは、仕様に準拠したOpenIDConnectおよびOAuth2.0エンドポイントを任意のASP.NETCoreアプリケーションに追加するミドルウェアです。
  • IdentityServer を使用すると、複数のアプリケーションとアプリケーションの種類に対してシングル サインオン (SSO) を実装できます。

構築手順

  • IdentityServer 4の構築手順に関してはこちらのQuickStartを参考にしています。
  • ソースコード見たいよって方はGitHub上に公式のサンプルソースが公開されているのでそちらをご確認ください。

変更点

  • IdentityServer3 と 4ではほとんど互換性があるため、基本的にクライアントやApi側は変更なしでupdate可能
  • IdentityServer 3ではビューの表示に制限があった(katana コンポーネントに依存していた)が、IdentityServer4からは好きなUI技術を利用することが可能になった
  • ユーザーストアの統合に利用されていたIdentityServerのIUserServiceがなくなり、IProfileServiceと、IResourceOwnerPasswordValidator の形で新しいユーザーストアの抽象化に置き換えられたため、これからはユーザー認証を自分で実装する必要がある

つまずいた点

[その1] IdentityServer3.AccessTokenValidationを利用した認証が通らない

  • 既存のApiがIdentityServer3.AccessTokenValidationというライブラリを用いて認証通していたのですが、上記構築手順通り進めただけだと401エラーとなり正常にアクセスできませんでした。
  • 原因としては、IdentityServer3.AccessTokenValidationなど、IdentityServer3の認証基盤で利用していたような認証ようのライブラリだと、新規で作成した認証と互換性がなくてエラーとなるようです。
  • 解決策としては、Api側は修正不要で、IdentityServer側のstartup.csで以下の設定を追加すればOKです。
namespace IdentityServer
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            ・・・
            var builder = services.AddIdentityServer((options) =>
            {
                options.EmitStaticAudienceClaim = true;  // !!!ここを追加!!!
            })
            ・・・
        }
    }
}

[その2] SilentRenewが止まらずに動き続ける

  • これは原因がいまいち明確でないのですが、なぜかSilentRenewが無限に発生し続けるという問題に直面しました
  • 対応方法としてはクライアント側でoidcのUserManagerを初期化する際に monitorSessionをfalseに指定することで正常に動くようになりました。
var mgr = new Oidc.UserManager({
    // これを追加する
    monitorSession: false
})