この .NET 8 コンソール アプリケーションは、Microsoft Entra ID 認証を使用して Azure Managed Redis に接続する方法を示しています。 重要な価値提案は、自動トークン更新による パスワードレス認証 であり、Redis 接続に対するセキュリティで保護された最新のアプローチを提供します。
GitHub のコードにスキップする
GitHub で Microsoft.Azure.StackExchangeRedis リポジトリを複製します。
[前提条件]
- .NET 8.0 SDK。
- Azure サブスクリプションにプロビジョニングされた Azure Managed Redis インスタンス。
- Azure ユーザーまたはサービス プリンシパルを Redis ユーザーとしてキャッシュに追加する必要があります。 Azure portal で、[リソース] メニューの [認証 ] に移動し、[ ユーザーまたはサービス プリンシパル] を選択して、ID を追加します。
- ローカル開発認証用の Azure CLI。
必須の NuGet パッケージ
| パッケージ | 目的 |
|---|---|
Microsoft.Azure.StackExchangeRedis |
StackExchange.Redis に Microsoft Entra ID 認証を追加する拡張機能ライブラリ |
Azure.Identity |
DefaultAzureCredentialおよびその他の Azure ID 実装を提供します |
StackExchange.Redis |
基になる Redis クライアント (依存関係として取り込まれた) |
Microsoft.Extensions.Logging.Console |
コンソールのログ記録による診断 |
認証方法
この拡張機能では複数の ID の種類がサポートされ、それぞれに対応する ConfigureForAzure*() 拡張メソッドがあります。
DefaultAzureCredential- 推奨されるアプローチ。 複数の資格情報ソース (環境変数、マネージド ID、Azure CLI 認証、Visual Studio 資格情報など) をチェーンし、最初に機能するものを使用します。 ローカルと Azure の両方で実行されるコードに最適です。User-Assigned マネージド ID - クライアント ID を指定し、Azure でホストされるアプリがどのマネージド ID を使用するかを明示的に指定する場合。
System-Assigned マネージド ID - リソースに自動的に割り当てられた ID を使用する Azure でホストされるアプリの場合。
サービス プリンシパル (シークレット) - 自動化されたシナリオまたは CI シナリオのクライアント ID、テナント ID、シークレット。
サービス プリンシパル (証明書) - セキュリティを強化するためのクライアント ID、テナント ID、X.509 証明書。
ローカルでの DefaultAzureCredential のしくみ
ローカルで開発する場合、 DefaultAzureCredential は次の方法を使用して認証を試みます。
az login
この方法では、Microsoft Entra ID アカウントを使用して Azure CLI にサインインします。 SDK はキャッシュされた資格情報を検出し、それらを使用してトークンを取得します。 Azure Portal の [リソース] メニューの [認証] を使用して、Microsoft Entra ID ユーザーを Azure Managed Redis リソースの Redis ユーザーとして構成する必要があります。
主要な実装パターン
接続の構成:
ConfigurationOptions configurationOptions = new()
{
Protocol = RedisProtocol.Resp3, // Recommended for seamless re-auth
LoggerFactory = loggerFactory,
AbortOnConnectFail = true, // Fail fast (use false in production)
BacklogPolicy = BacklogPolicy.FailFast
};
Entra ID のセットアップ:
await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential());
var connection = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
Redis の基本的な操作:
var database = connection.GetDatabase();
await database.StringSetAsync("key", "value");
var value = await database.StringGetAsync("key");
トークンのライフサイクルと自動再認証
拡張機能は、OAuth2 トークンのライフサイクルを自動的に処理します。
- 初期取得 - 接続する前にトークンを取得します。
- プロアクティブ更新 - トークンの有効期限が切れる前 (約 1 時間) は、バックグラウンドで新しいトークンを取得します。
- 再認証 - コマンドを削除せずに、新しいトークンを使用して接続を再認証します。
監視のために、トークン イベントをサブスクライブできます。
| Event | 目的 |
|---|---|
TokenRefreshed |
取得された新しいトークン |
TokenRefreshFailed |
トークンの更新に失敗しました (引き続き古いトークンを使用) |
ConnectionReauthenticated |
接続が正常に再認証されました |
ConnectionReauthenticationFailed |
接続の再認証に失敗しました |
RESP3 プロトコルと RESP2 プロトコル
このサンプルでは、次の理由から RESP3 (Protocol = RedisProtocol.Resp3) を使用しています。
- RESP2 では、対話型コマンドと pub/sub 用に個別の接続が作成されます。
- 対話型接続のみが事前に再認証されます。
- Pub/sub 接続はトークンの有効期限が切れると閉じ、短時間の中断が発生します。
- RESP3 は 1 つの接続ですべてを多重化し、これらの中断を回避します。
Azure の前提条件
- Azure Managed Redis インスタンスを作成します。
- [データ アクセス構成] で Microsoft Entra ID 認証を有効にします。
- 適切なアクセス許可 (データ所有者、データ共同作成者など) を使用して、ID を Redis ユーザーとして追加します。
- ローカルで
を実行し、Entra ID アカウントで認証します。
Redis の基本的な概念
| 概念 | Description |
|---|---|
ConnectionMultiplexer |
Redisへのスレッドセーフ性を持つシングルトン接続プール。 1 回作成し、アプリの有効期間中に再利用します。 |
IDatabase |
コマンドを実行するためのインターフェイス (StringGet、 StringSet、 HashGetなど)。 |
| エンドポイントの形式 |
endpoint:10000 (TLS) を使用して Azure Managed Redis を使用できます。 |
サンプルの実行
az login
cd sample
dotnet run
Redis エンドポイント ( <your-redis-name>.<region>.redis.azure.net:10000 など) を入力し、認証方法 1 (DefaultAzureCredential) を選択し、コマンドが成功するたびに 1 秒ごとに + 文字が出力されるのを確認します。 60 分以上実行して、トークンの自動更新が機能することを確認します。
実稼働に関する考慮事項
| Setting | サンプル値 | 生産価値 |
|---|---|---|
AbortOnConnectFail |
true |
false (起動時に再試行) |
BacklogPolicy |
FailFast |
Default (一時的な障害時のキュー コマンド) |
| 接続の有効期間 | デモ ループ | DI 経由のシングルトン (IConnectionMultiplexer) |
このサンプルでは、Azure Managed Redis を使用するすべての .NET アプリケーションで、セキュリティで保護されたパスワードレス Entra ID 認証の完全なリファレンス実装を提供します。