![](/img/trans.png)
[英]Importing MLClient in online endpoint gives error "cannot import name TokenCredential from azure.core.credentials"
[英]How to get a TokenCredential from a ServiceClientCredential object?
在我的应用程序中,我们目前正在使用来自 Microsoft.Rest 的 ServiceClientCredentials。 我们正在迁移部分应用程序以开始使用Azure.ResourceManager
的ArmClient
。
基本上我们之前所有集成到 Azure 的应用程序都使用Microsoft.Azure.ResourceManager
,它暴露BlobClient
或SecretClient
等代理,并且这些都接受ServiceClientCredentials
作为有效的令牌类型。
现在,对于ArmClient
,我需要使用派生自Azure.Core
的TokenCredential
的DefaultAzureCredential
进行身份验证。
令人惊讶的是,我还没有找到任何有关如何创建此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.