【ITニュース解説】Using OIDC with .NET to connect to MongoDB Atlas
2025年09月22日に「Dev.to」が公開したITニュース「Using OIDC with .NET to connect to MongoDB Atlas」について初心者にもわかりやすく解説しています。
ITニュース概要
.NETアプリとMongoDB AtlasをOIDCで安全に接続する方法を解説。Azure EntraIDを活用し、認証済みユーザーのみがデータにアクセスできるシステムを構築する。Microsoftの認証ライブラリとMongoDB C#ドライバーを使った実装手順を示す。
ITニュース解説
この解説は、OpenID Connect(OIDC)という認証技術を使って、.NETアプリケーションをMongoDB Atlasというクラウドデータベースに安全に接続する方法について説明する。企業向けのアプリケーションでは、データとそのデータへのアクセスを保護することが非常に重要であり、多くの企業がAzure EntraID(旧Azure Active Directory)のようなIDアクセス管理(IAM)システムを使って、ユーザー認証とアクセス制御を行っている。
ここで取り上げるのは、.NETで開発されたアプリケーションがAzure EntraIDのOIDCを利用し、Microsoftアカウントでログインするだけで、権限を持つユーザーだけがMongoDB Atlas上のデータにアクセスできるようになる仕組みである。これはAzure EntraIDに限らず、AWSやGoogle Cloudが提供するIAMソリューションでも同様に設定できる。
まず、この仕組みを実装するために必要な準備がある。Azure EntraID側では、有料のサブスクリプションが必要となる。EntraIDからアプリケーション(クライアント)ID、OIDCメタデータドキュメントのURL、そしてドメイン値を取得する必要がある。これらはAzureポータルから確認できる。次に、GitHubリポジトリから提供されるサンプルコードを自分のアカウントにフォークし、ローカルにクローンしておく。MongoDB Atlas側では、OIDCをサポートするエンタープライズ機能であるWorkforce Federationを利用するため、M10以上のクラスターが必要となる。また、MongoDB Atlas Workforce Federationを設定し、EntraIDと連携したデータベースユーザーグループを作成し、データベースへのアクセス権を付与しておく。最後に、MongoDB Atlasクラスターへの接続文字列をアプリケーションの設定ファイル(appsettings.jsonなど)に追加する。この接続文字列には、OIDC認証を使用するため、ユーザー名とパスワードは含まれない。
次に、MongoDB Atlas側のWorkforce Federationが正しく設定されていることを確認する。MongoDB Atlasの組織ページにアクセスし、「Identity & Access」の下にある「Federation」を開く。ここで「Open Federation Management App」をクリックし、「Identity Providers」の項目に、EntraIDの設定値が正しく表示され、「Complete」のラベルが付いていることを確認する。また、MongoDB Atlasプロジェクトの「Database Access」セクションで、EntraIDのTenant IDと一致するユーザーが追加されていることも確認する。
アプリケーション側では、まず必要なNuGetパッケージを追加する。具体的には、Microsoft.Identity.Web、Microsoft.Identity.Web.UI、Microsoft.AspNetCore.Authentication.OpenIdConnect、Microsoft.Identity.Clientの四つのパッケージをプロジェクトに導入する。これらは、.NETアプリケーションでOIDC認証を簡単に実装するためのライブラリである。
次に、アプリケーションの設定ファイル(appsettings.json)と、アプリケーションの起動設定を行うProgram.csファイルを更新する。appsettings.jsonには、EntraIDの認証情報として、OIDCメタデータドキュメントのURL、ドメイン、クライアントID、クライアントシークレット、コールバックパス、リダイレクトURIなどを設定する。これらのプレースホルダーは、EntraIDから取得した自身の値に置き換える必要がある。
Program.csでは、OIDC認証を有効にするためのコードを追加する。まず、Microsoft.AspNetCore.Authentication.OpenIdConnectやMicrosoft.Identity.Webなどのusingステートメントを追加する。その後、アプリケーションサービスにOIDC認証を追加し、EntraIDの認証情報を利用するように設定する。具体的には、builder.Services.AddAuthenticationメソッドを使い、AddMicrosoftIdentityWebAppでEntraIDとの連携を設定する。また、認証と認可のミドルウェア(app.UseAuthentication()、app.UseAuthorization())をHTTPリクエストパイプラインに追加することで、アプリケーション全体で認証フローが機能するようにする。ここで重要な変更点として、MongoDBへの接続サービスであるMongoDBServiceの登録方法をAddSingletonからAddScopedに変更する。これは、認証関連のサービスが「スコープ付き」というライフサイクルを持つため、それに合わせてMongoDBサービスもスコープ付きにすることで、ランタイムエラーを防ぐためである。
次に、MongoDBへの接続を管理するMongoDBService.csを更新する。このサービスでは、認証されたユーザーのアクセストークンを使ってMongoDB Atlasに接続するようにする。まず、認証関連のusingステートメントと、HTTPコンテキストやトークン取得のためのインターフェース(IHttpContextAccessor、ITokenAcquisition)を導入し、コンストラクタでそれらを初期化する。そして、InitializeAsyncという非同期メソッドを追加する。このメソッドは、Microsoft.Identity.Webライブラリを使って現在のユーザーのアクセストークンを取得する。アクセストークンが取得できたら、MongoDBの接続文字列にauthMechanism=MONGODB-OIDC&authSource=$externalというパラメータを追加し、OIDC認証を使用することをMongoDBに伝える。さらに、取得したアクセストークンをMongoClientSettings.Credentialに設定することで、OIDC認証による安全なMongoDB接続を確立する。この際、MongoDB C# Driverが提供するIOidcCallbackインターフェースを実装したAccessTokenOidcCallbackという内部クラスを定義し、アクセストークンをドライバーに渡す役割を担わせる。最後に、この認証情報を使ってMongoClientを初期化し、MongoDBへの接続確認を行う。
ユーザーインターフェース側では、ログインページとホーム画面を更新する。Login.razorという新しいBlazorコンポーネントを追加し、ユーザーがログイン済みかどうかを判断し、未ログインの場合はEntraIDでの認証を促すリンクを表示する。ログインに成功すると、先ほど定義したMongoDBService.InitializeAsync()メソッドを呼び出し、MongoDBとの認証済み接続を確立した後、ホーム画面にリダイレクトする。ホーム画面(Home.razor)では、ログインしたユーザーのユーザー名を画面の右上に表示する機能を追加する。これにより、ユーザーは自分が正しくログインしていることを視覚的に確認できる。
これらの設定とコードの追加が完了したら、アプリケーションを実行してテストする。初めてアプリケーションを起動すると、Microsoftアカウントでのログインが求められる。EntraIDを設定したテナント内のアカウントでログインすると、ホームページにリダイレクトされ、画面右上に自身のユーザー名が表示されることを確認できる。テスト時には、セッションキャッシュの仕組みが実装されていないため、アプリケーションを再実行する際にはブラウザのキャッシュとCookieをクリアする必要がある点に注意が必要である。
このように、OIDCを.NETアプリケーションに組み込み、MongoDB Atlasと連携させることで、安全で使いやすい認証システムを構築できる。このチュートリアルではAzure EntraIDを使用したが、MongoDB AtlasのOIDCサポートはAzureに限定されず、GoogleやAWSのIDプロバイダーとも連携可能である。さらに、このOIDC認証とMongoDBのQueryable Encryption(QE)という、データ転送中だけでなく保存時も暗号化しつつ、暗号化されたデータのクエリも可能にする機能と組み合わせることで、より高いレベルのセキュリティを実現できる。