【问题标题】:How to get a TokenCredential from a ServiceClientCredential object?如何从 ServiceClientCredential 对象获取 TokenCredential?
【发布时间】:2023-01-30 03:13:47
【问题描述】:

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

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

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

令人惊讶的是,我还没有找到任何关于如何创建这个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 替换原则告诉我们,一个类的任何实现都可以替换该类的任何其他实例,而不会破坏应用程序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2010-11-17
      • 2010-11-23
      • 1970-01-01
      • 2018-10-14
      • 2015-01-15
      • 2019-02-09
      相关资源
      最近更新 更多