クラウドネイティブ アプリケーションの IdentityServer
ヒント
このコンテンツは、Azure 用のクラウド ネイティブ .NET アプリケーションの設計に関する電子ブックからの抜粋であり、.NET Docs またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できます。
IdentityServer は、ASP.NET Core 用の OpenID Connect (OIDC) および OAuth 2.0 標準を実装する認証サーバーです。 Web エンドポイント、ネイティブ エンドポイント、モバイル エンドポイント、API エンドポイントのいずれであっても、すべてのアプリケーションに対して要求を認証する一般的な方法を提供するように設計されています。 IdentityServer を使用して、複数のアプリケーションとアプリケーションの種類に対して単一 Sign-On (SSO) を実装できます。 サインイン フォームと同様のユーザー インターフェイスを使用して実際のユーザーを認証したり、通常はユーザー インターフェイスなしでトークンの発行、検証、更新を行うサービス ベースの認証に使用できます。 IdentityServer は、カスタマイズ可能なソリューションとして設計されています。 各インスタンスは通常、個々の組織や一連のアプリケーションのニーズに合わせてカスタマイズされます。
一般的な Web アプリのシナリオ
通常、アプリケーションは次のシナリオの一部またはすべてをサポートする必要があります。
- ブラウザーを使用して Web アプリケーションにアクセスする人間のユーザー。
- ブラウザー ベースのアプリからバックエンド Web API にアクセスする人間のユーザー。
- バックエンド Web API にアクセスするモバイル/ネイティブ クライアント上の人間のユーザー。
- バックエンド Web API にアクセスする他のアプリケーション (アクティブなユーザーまたはユーザー インターフェイスなし)。
- アプリケーションは、独自の ID を使用するか、ユーザーの ID に委任して、他の Web API と対話する必要がある場合があります。
図 8-1. アプリケーションの種類とシナリオ。
これらの各シナリオでは、公開されている機能を未承認の使用から保護する必要があります。 少なくとも、これは通常、リソースの要求を行うユーザーまたはプリンシパルを認証する必要があります。 この認証では、SAML2p、WS-Fed、OpenID Connect などのいくつかの一般的なプロトコルのいずれかを使用できます。 API との通信では、通常、OAuth2 プロトコルとそのセキュリティ トークンのサポートが使用されます。 これらの重要なクロスカット セキュリティの懸念事項とその実装の詳細をアプリケーション自体から分離することで、一貫性が確保され、セキュリティと保守容易性が向上します。 これらの懸念事項を IdentityServer などの専用製品にアウトソーシングすることは、すべてのアプリケーションがこれらの問題自体を解決するための要件に役立ちます。
IdentityServer は、ASP.NET Core アプリケーション内で実行されるミドルウェアを提供し、OpenID Connect と OAuth2 のサポートを追加します (サポートされている仕様 参照)。 組織では、IdentityServer ミドルウェアを使用して独自の ASP.NET Core アプリを作成し、トークン ベースのすべてのセキュリティ プロトコルの STS として機能します。 IdentityServer ミドルウェアは、次のような標準機能をサポートするためにエンドポイントを公開します。
- 承認 (エンド ユーザーの認証)
- トークン (プログラムでトークンを要求する)
- 検出 (サーバーに関するメタデータ)
- ユーザー情報 (有効なアクセス トークンを使用してユーザー情報を取得する)
- デバイスの承認 (デバイス フローの承認を開始するために使用)
- イントロスペクション (トークン検証)
- 失効 (トークン失効)
- セッションの終了 (すべてのアプリでシングル サインアウトをトリガーする)
作業の開始
IdentityServer を使用できます。
- コミュニティ ライセンスを使用すると、IdentityServer を小規模企業や非営利の に無料で使用できます (条件が適用されます)
- 商業シナリオで IdentityServer を使用できる有料オプションです
価格の詳細については、公式製品の 価格ページを参照してください。
NuGet パッケージを使用して、アプリケーションに追加できます。 メイン パッケージは IdentityServer であり、400 万回以上ダウンロードされています。 基本パッケージにはユーザー インターフェイス コードは含まれていないので、メモリ内構成のみをサポートします。 データベースで使用するには、Entity Framework Core を使用して IdentityServer の構成データと運用データを格納する、Duende.IdentityServer.Storageなどのデータ プロバイダーも必要になります。 ユーザー インターフェイスの場合は、クイック スタート UI リポジトリ から ASP.NET Core MVC アプリケーションにファイルをコピーして、IdentityServer ミドルウェアを使用したサインインとサインアウトのサポートを追加できます。
構成
IdentityServer では、各カスタム インストールの一部として構成できるさまざまな種類のプロトコルとソーシャル認証プロバイダーがサポートされています。 これは通常、ASP.NET Core アプリケーションの Program
クラス (または ConfigureServices
メソッドの Startup
クラス) で行われます。 構成には、サポートされているプロトコルと、使用するサーバーとエンドポイントへのパスを指定する必要があります。 図 8-2 は、IdentityServer Quickstart for ASP.NET Core アプリケーション プロジェクトの構成例を示しています。
// some details omitted
builder.Services.AddIdentityServer();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddGoogle("Google", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "<insert here>";
options.ClientSecret = "<insert here>";
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://localhost:5001";
options.ClientId = "web";
options.ClientSecret = "secret";
options.ResponseType = "code";
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.MapInboundClaims = false; // Don't rename claim types
options.SaveTokens = true;
});
}
図 8-2. IdentityServer の構成。
JavaScript クライアント
多くのクラウドネイティブ アプリケーションでは、フロントエンドでサーバー側 API とリッチ クライアント シングル ページ アプリケーション (SPA) が使用されます。 IdentityServer は、NPM を介して JavaScript クライアント (oidc-client.js
) を出荷します。これを SPA に追加して、Web API のサインイン、サインアウト、トークンベースの認証に IdentityServer を使用できるようにします。 さらに、トークン サーバーと IETF の OAuth 2.0 for Browser-Based Applications 仕様とのすべてのセキュリティ プロトコル対話を実装する バックエンド for フロントエンド (BFF) を使用できます。
参照
.NET