繁体   English   中英

如何从 ServiceClientCredential object 获取 TokenCredential?

[英]How to get a TokenCredential from a ServiceClientCredential object?

在我的应用程序中,我们目前正在使用来自 Microsoft.Rest 的 ServiceClientCredentials。 我们正在迁移部分应用程序以开始使用Azure.ResourceManagerArmClient

基本上我们之前所有集成到 Azure 的应用程序都使用Microsoft.Azure.ResourceManager ,它暴露BlobClientSecretClient等代理,并且这些都接受ServiceClientCredentials作为有效的令牌类型。

现在,对于ArmClient ,我需要使用派生自Azure.CoreTokenCredentialDefaultAzureCredential进行身份验证。

令人惊讶的是,我还没有找到任何有关如何创建此TokenCredential的示例。

自从我登录到 Visual Studio 后, DefaultAzureCredential仅适用于我的本地 PC,但不适用于我使用基于证书的身份验证公开为ServiceClientCredential的构建管道。

这比我想象的要容易。 该修复程序最终添加了一个新的 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 替换原则告诉我们,class 的任何实现都可以替换为 class 的任何其他实例,而不会破坏应用程序。

注意:上面的示例是伪代码,可能需要稍作更改才能在您的环境中工作,并且应该进行清理以符合您的团队编码标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM