C# ADAL V3、Azure数据湖、证书和ServiceClientCredentials

C# ADAL V3、Azure数据湖、证书和ServiceClientCredentials,c#,azure-active-directory,adal,azure-data-lake,azure-eventhub,C#,Azure Active Directory,Adal,Azure Data Lake,Azure Eventhub,我有点麻烦,我需要用同一段代码(C#)从同一服务主体访问Azure Event Hub和Azure Data Lake。服务主体是Azure AD应用程序,我正在使用证书进行身份验证 如果我使用ADAL2.x并进行身份验证,我可以很好地连接到Azure Data Lake,但事件集线器(WindowsAzure.ServiceBus)无法进行身份验证(请参阅下文) 我用于为Azure Data Lake创建凭据的ADAL 2.x代码如下所示,这可以100%正常工作: public stati

我有点麻烦,我需要用同一段代码(C#)从同一服务主体访问Azure Event Hub和Azure Data Lake。服务主体是Azure AD应用程序,我正在使用证书进行身份验证

如果我使用ADAL2.x并进行身份验证,我可以很好地连接到Azure Data Lake,但事件集线器(WindowsAzure.ServiceBus)无法进行身份验证(请参阅下文)

我用于为Azure Data Lake创建凭据的ADAL 2.x代码如下所示,这可以100%正常工作:

  public static ServiceClientCredentials GetCreds_SPI_Cert(string tenant, Uri tokenAudience, string clientId, string certificateThumbprint)
        {
            var certificate = FindCertificateByThumbprint(certificateThumbprint);

            SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

            var clientAssertionCertificate = new ClientAssertionCertificate(clientId, certificate);
            var serviceSettings = ActiveDirectoryServiceSettings.Azure;
            serviceSettings.TokenAudience = tokenAudience;

            var creds = ApplicationTokenProvider.LoginSilentWithCertificateAsync(tenant, clientAssertionCertificate, serviceSettings).GetAwaiter().GetResult();
            return creds;
        }
如果我升级到ADAL v3以便访问事件中心(WindowsAzure.ServiceBus需要它),那么以下代码可以正常工作(对于事件中心):

请注意,事件中心身份验证
CreateAdTokenProvider
中的令牌提供程序仅在ADALv3中可用。服务总线和数据湖客户端也都需要不同类型的凭据

如果我使用ADAL V3并返回数据湖代码,
GetCreds\u SPI\u Cert
将失败,并出现以下错误:

找不到方法: 'System.Threading.Tasks.Task'1 Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.AcquireTokenAsync(System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertificate')


简而言之,我如何使用ADAL v3针对Azure Data Lake对Azure AD应用程序服务主体进行身份验证(使用证书)?由于事件中心依赖关系,我无法降级到ADAL2.x

github repo中深入记录的身份验证适配器可能有助于设计解决方案,尽管可能不是直接的解决方案:

由于混合使用旧SDK*和新SDK*可能会发生身份验证冲突 SDK*。依赖于新创建的凭据类型的SDK 身份验证库 (Microsoft.Rest.ClientRuntime.Azure.Authentication,键入= ServiceClientCredentials)与凭据类型不兼容 用于较旧的SDK(Microsoft.Azure.Common,类型= SubscriptionCloudCredentials)。问题是使用两种不同的 身份验证库将要求您进行两次身份验证,这 这是一次痛苦的经历


我正在绞尽脑汁,很确定我遇到了一个适配器,可以在ADAL的多个版本之间切换,这是很久以前的事了,不幸的是我的记忆有点模糊。@AlexKeySmith,任何线索都会有帮助,虽然除了加载不同的应用程序域或使用某种CLI之外,我看不到任何合理的选择。明天回到办公室时,我会尽量记住翻阅我的OneNote,这是为了一个稍微不同的问题,但听起来很相关。这可能会提供一些提示,虽然可能不是直接的答案:如果证明有用,请告诉我,我会把它作为答案。
public static TokenProvider GetTokenProviderViaCetificate(string tenant, Uri tokenAudience, string clientId, string certificateThumbprint)
{
    var certificate = FindCertificateByThumbprint(certificateThumbprint);
    return TokenProvider.CreateAadTokenProvider(
        new AuthenticationContext($"https://login.windows.net/{tenant}"),
        new ClientAssertionCertificate(clientId, certificate),
        ServiceAudience.EventHubsAudience);
}
public class SubscriptionCredentialsAdapter : SubscriptionCloudCredentials
{
    ServiceClientCredentials _credentials;
    string _subscriptionId;

    public SubscriptionCredentialsAdapter(ServiceClientCredentials wrapped, string subscriptionId)
    {
        _credentials = wrapped;
        _subscriptionId = subscriptionId;
    }

    public override string SubscriptionId
    {
        get { return _subscriptionId; }
    }

    public override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
       return _credentials.ProcessHttpRequestAsync(request, cancellationToken);
    }
}