Azure Identity最佳实践:.NET Web应用多资源授权的Credential实例选择
关于共用或单独创建DefaultAzureCredential实例的最佳实践
最佳实践是共用同一个DefaultAzureCredential实例,原因如下:
- 性能更优:DefaultAzureCredential内部会缓存已获取的令牌,共用实例能避免重复执行身份验证流程(比如多次尝试不同验证方式、重复请求令牌),减少不必要的网络开销和延迟。
- 资源利用率更高:每个实例都会维护自己的缓存和状态,多实例会占用更多内存资源,单实例能降低资源消耗。
- 行为更一致:共用实例能确保所有服务使用相同的身份验证策略(比如验证方法优先级、缓存规则),避免因实例配置差异导致的身份验证行为不一致。
推荐代码示例
// 所有服务共用单个AzureCredentials实例 var credentials = new DefaultAzureCredential(); var blobs = new BlobServiceClient(new Uri("mycontainer.url..."), credentials); var eventHubClient = new EventHubProducerClient("eventhub.servicebus.windows.net", credentials); var postgresScope = new TokenRequestContext(scopes: new string[] { "https://ossrdbms-aad.database.windows.net/.default" }); var postgresToken = await credentials.GetTokenAsync(postgresScope, cancellationToken);
不推荐的写法(原因:重复创建实例会导致缓存失效、额外的身份验证开销)
// 每个服务拥有独立的AzureCredentials实例(不推荐) var blobs = new BlobServiceClient(new Uri("mycontainer.url..."), new DefaultAzureCredential()); var eventHubClient = new EventHubProducerClient("eventhub.servicebus.windows.net", new DefaultAzureCredential()); var postgresScope = new TokenRequestContext(scopes: new string[] { "https://ossrdbms-aad.database.windows.net/.default" }); var postgresToken = await new DefaultAzureCredential().GetTokenAsync(postgresScope, cancellationToken);
如果有特殊需求(比如不同服务需要不同的身份验证配置,比如指定不同租户ID、排除某些验证方法),可以单独创建配置不同的DefaultAzureCredential实例,但这种场景很少见,大部分情况下共用单实例是最优选择。
内容的提问来源于stack exchange,提问作者Garfield
相关产品推荐
相关产品推荐

