クラウドネイティブ アプリケーション用の IdentityServer

ヒント

このコンテンツは eBook の「Azure 向けクラウド ネイティブ .NET アプリケーションの設計」からの抜粋です。.NET Docs で閲覧できるほか、PDF として無料ダウンロードすると、オンラインで閲覧できます。

Cloud Native .NET apps for Azure eBook cover thumbnail.

IdentityServer は、ASP.NET Core 向けの OpenID Connect (OIDC) と OAuth 2.0 標準を実装する認証サーバーです。 これは、Web、ネイティブ、モバイル、API のいずれのエンドポイントであるかを問わず、すべてのアプリケーションに対する要求を認証するための一般的な方法を提供するように設計されています。 IdentityServer を使用すると、複数のアプリケーションとアプリケーションの種類に対してシングル サインオン (SSO) を実装できます。 サインイン フォームや同様のユーザー インターフェイスを介して実際のユーザーを認証するため、また、通常はユーザー インターフェイスなしでのトークンの発行、検証、更新を含むサービスベースの認証に使用できます。 IdentityServer はカスタマイズ可能なソリューションとして設計されています。 各インスタンスは、通常、個々の組織や一連のアプリケーションのニーズに合わせてカスタマイズされます。

一般的な Web アプリのシナリオ

通常、アプリケーションでは、次のシナリオの一部またはすべてをサポートする必要があります。

  • ブラウザーを使用して Web アプリケーションにアクセスする人間のユーザー。
  • ブラウザーベースのアプリからバックエンド Web API にアクセスする人間のユーザー。
  • バックエンド Web API にアクセスするモバイル/ネイティブ クライアント上の人間のユーザー。
  • バックエンド Web API にアクセスする他のアプリケーション (アクティブなユーザーまたはユーザー インターフェイスはなし)。
  • アプリケーションが、独自の ID を使用するか、ユーザーの ID に委任することによって、他の Web API と対話することが必要な場合がある。

Application types and scenarios

図 8-1。 アプリケーションの種類とシナリオ。

これらの各シナリオでは、公開されている機能を承認されていない使用から保護する必要があります。 通常は、少なくとも、リソースの要求を行うユーザーまたはプリンシパルを認証する必要があります。 この認証には、SAML2p、WS-Fed、OpenID Connect など、いくつかの一般的なプロトコルの 1 つを使用できます。 API との通信には、通常、OAuth2 プロトコルとセキュリティ トークンのサポートが使用されます。 これらの重要なセキュリティの横断的考慮事項とその実装の詳細をアプリケーション自体から分離することで、一貫性が確保され、セキュリティと保守性が向上します。 このような考慮事項を IdentityServer のような専用の製品にアウトソーシングすると、すべてのアプリケーションでこれらの問題を解決するという要件に役立ちます。

IdentityServer によって、ASP.NET Core アプリケーション内で実行されるミドルウェアが提供され、OpenID Connect と OAuth2 のサポートが追加されます (「Supported Specifications」(サポートされる仕様) を参照してください)。 組織では、すべてのトークンベースのセキュリティ プロトコルに対して STS として機能する IdentityServer ミドルウェアを使用して、独自の ASP.NET Core アプリを作成します。 IdentityServer ミドルウェアにより、次のような標準機能をサポートするためのエンドポイントが公開されます。

  • 承認 (エンド ユーザーの認証)
  • トークン (プログラムによるトークンの要求)
  • 検出 (サーバーに関するメタデータ)
  • ユーザー情報 (有効なアクセス トークンを使用したユーザー情報の取得)
  • デバイスの認可 (デバイス フローの認可を開始するために使用)
  • イントロスペクション (トークンの検証)
  • 失効 (トークンの失効)
  • セッションの終了 (すべてのアプリでのシングル サインアウトのトリガー)

作業の開始

IdentityServer4 は、デュアル ライセンスで利用できます。

  • RPL - オープンソースの作業で使用する場合は、IdentityServer4 を無料で使用できます
  • 有料 - 商用シナリオで IdentityServer4 を使用できます

価格について詳しくは、製品の公式の価格ページをご覧ください。

NuGet パッケージを使用して、それをアプリケーションに追加することができます。 メイン パッケージは IdentityServer4 であり、400 万回以上ダウンロードされています。 基本パッケージにはユーザー インターフェイス コードは含まれず、メモリ構成のみがサポートされます。 データベースでそれを使うには、Entity Framework Core を使って IdentityServer の構成と運用のデータを格納する IdentityServer4.EntityFramework のようなデータ プロバイダーも必要になります。 ユーザー インターフェイスでは、クイック スタート UI リポジトリから ASP.NET Core MVC アプリケーションにファイルをコピーして、IdentityServer ミドルウェアを使用したサインインとサインアウトのサポートを追加することができます。

構成

IdentityServer では、各カスタム インストールの一部として構成できるさまざまな種類のプロトコルとソーシャル認証プロバイダーがサポートされます。 これは通常、ASP.NET Core アプリケーションの Program クラス (または Startup クラス内の ConfigureServices メソッド) で行われます。 構成には、サポートされるプロトコル、および使用されるサーバーとエンドポイントへのパスの指定が含まれます。 図 8-2 は、IdentityServer4 クイック スタート UI プロジェクトから取得した構成の例を示しています。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // some details omitted
        services.AddIdentityServer();

          services.AddAuthentication()
            .AddGoogle("Google", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                options.ClientId = "<insert here>";
                options.ClientSecret = "<insert here>";
            })
            .AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                options.Authority = "https://demo.identityserver.io/";
                options.ClientId = "implicit";
                options.ResponseType = "id_token";
                options.SaveTokens = true;
                options.CallbackPath = new PathString("/signin-idsrv");
                options.SignedOutCallbackPath = new PathString("/signout-callback-idsrv");
                options.RemoteSignOutPath = new PathString("/signout-idsrv");

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role"
                };
            });
    }
}

図 8-2。 IdentityServer の構成。

JavaScript クライアント

多くのクラウドネイティブ アプリケーションのフロントエンドでは、サーバー側 API とリッチ クライアント シングルページ アプリケーション (SPA) が使われます。 IdentityServer により、NPM を介して JavaScript クライアント (oidc-client.js) が配布されます。これを SPA に追加することで、Web API のサインイン、サインアウト、トークンベース認証に IdentityServer を使用できるようになります。

リファレンス