【问题标题】:How to get a TokenCredential from a ServiceClientCredential object?如何从 ServiceClientCredential 对象获取 TokenCredential?
【发布时间】:2023-01-30 03:13:47
【问题描述】:
在我的应用程序中,我们目前正在使用来自 Microsoft.Rest 的 ServiceClientCredentials。我们正在迁移部分应用程序以开始使用 Azure.ResourceManager 的 ArmClient。
基本上我们之前所有与 Azure 的应用程序集成都使用 Microsoft.Azure.ResourceManager,它公开了像 BlobClient 或 SecretClient 这样的代理,并且这些都接受 ServiceClientCredentials 作为有效的令牌类型。
现在,对于 ArmClient,我需要使用来自 Azure.Core 的 TokenCredential 的 DefaultAzureCredential 进行身份验证。
令人惊讶的是,我还没有找到任何关于如何创建这个TokenCredential 的示例。
DefaultAzureCredential 仅在我的本地 PC 上工作,因为我已登录到 Visual Studio,但在我使用基于证书的身份验证公开为 ServiceClientCredential 的构建管道上不起作用。
【问题讨论】:
标签:
azure
azure-managed-identity
azure-identity
【解决方案1】:
这比我想象的要容易。该修复程序最终添加了一个新的 ServiceCollection 扩展方法并传入了 IWebHostEnvironment。
我用它来确定是否在本地调试中运行,在这种情况下我们可以使用 DefaultAzureCredential,或者是否在生产模式下运行,在这种情况下我们应该使用基于证书的身份验证。
它看起来有点像这样,而且很有魅力。
public static IServiceCollection AddDefaultAzureToken (this IServiceCollection services, IWebHostEnvironment environment)
{
if (environment.IsDevelopment())
{
var l = new DefaultAzureCredential();
services.AddSingleton<TokenCredential, l>;
}
else
{
var certCredential= new ClientCertificateCredential(null, null, "Abc");
services.AddSingleton<TokenCredential, certCredential>;
}
return services;
}
这是有效的,因为 DefaultAzureCredential 和 ClientCertficateCredential 都具有 TokenCredential 的共同祖先,以及 SOLID 中的 L,Liskov 替换原则告诉我们,一个类的任何实现都可以替换该类的任何其他实例,而不会破坏应用程序。
注意:上面的示例是伪代码,可能需要稍作更改才能在您的环境中工作,并且应该进行清理以符合您的团队编码标准。