17

要在 azure sdk fluent nuget 中使用 Azure 进行身份验证,有一种使用客户端 ID 和机密的方法,如下所示

var azureCredentials = new AzureCredentials(new 
ServicePrincipalLoginInformation
        {
            ClientId = "ClientId",
            ClientSecret = "ClientSecret"
        }, "tenantId", AzureEnvironment.AzureGlobalCloud);

在下面的代码中创建 IAzure 时,是否有任何接口可以使用身份验证令牌 (JWT) 而不是使用客户端 ID 和机密?

_azure = Azure
            .Configure()
            .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
            .Authenticate(azureCredentials)
            .WithSubscription(_subscriptionId); 

注意:我有一个单独的身份验证器模块,它自己保存客户端 ID 和机密,并使用它们来获取将由其他组件/sdks 使用的身份验证令牌。

4

3 回答 3

23

答案其实是肯定的,可以使用认证令牌(JWT)。只是不是那么明显。

var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId, false);
var result = context.AcquireToken("https://management.core.windows.net/", clientId, new Uri("http://localhost"), PromptBehavior.Always);
var token = result.AccessToken;
var client = RestClient
    .Configure()
    .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .WithCredentials(new TokenCredentials(token))
    .Build();
var azure = Azure
    .Authenticate(client, tenantId)
    .WithSubscription(subscriptionId);

叹息...他们已将 WithCredentials 更改为使用 AzureCredentials 而不是 ServiceClientCredentials。这是一个更新的版本:-

var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId, false);
var result = context.AcquireToken("https://management.core.windows.net/", clientId, new Uri("http://localhost"), PromptBehavior.Always);
var token = result.AccessToken;
var tokenCredentials = new TokenCredentials(token);
var azureCredentials = new AzureCredentials(
    tokenCredentials,
    tokenCredentials,
    tenantId,
    AzureEnvironment.AzureGlobalCloud);
var client = RestClient
    .Configure()
    .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .WithCredentials(azureCredentials)
    .Build();
var azure = Azure
    .Authenticate(client, tenantId)
    .WithSubscription(subscriptionId);
于 2017-07-17T21:02:16.660 回答
9

从 Azure Management Fluent SDK v1.10 开始,您可以使用派生自 ServiceClientCredentials 的任何凭据提供程序。换句话说,您应该能够像这样将已经获得的 Bearer 令牌字符串传递给 AzureCredentials 构造函数

var customTokenProvider = new AzureCredentials(
                        new TokenCredentials(armAuthToken),
                        new TokenCredentials(graphAuthToken),
                        tenantId,
                        AzureEnvironment.AzureGlobalCloud);

var client = RestClient
                    .Configure()
                    .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
                    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                    .WithCredentials(customTokenProvider)
                    .Build();

var authenticatedClient = Azure.Authenticate(client, tenantId);
于 2018-05-10T18:22:31.367 回答
0

在下面的代码中创建 IAzure 时,是否有任何接口可以使用身份验证令牌 (JWT) 而不是使用客户端 ID 和机密?

总之没有。根据我的经验,如果我们想访问相应的 Azure 资源,那么我们需要从相应的资源中获取身份验证令牌(JWT)。Azure 有很多资源,例如 AzureSQL、KeyVault、ResourceManagement 等。

根据我的选择,使用可以访问所有 Azure 资源的身份验证令牌 (JWT) 是没有意义的

目前,我们可以从文件、ServicePrincipalLoginInformation、UserLoginInformation 中获取AzureCredentials

如果我们想操作某个资源,那么我们可以使用身份验证令牌(JWT)来做,以 KeyVault 为例。

    public static async Task<string> GetAccessToken(string azureTenantId,string azureAppId,string azureSecretKey)
    {

        var context = new AuthenticationContext("https://login.windows.net/" + azureTenantId);
        ClientCredential clientCredential = new ClientCredential(azureAppId, azureSecretKey);
        var tokenResponse =await context.AcquireTokenAsync("https://vault.azure.net", clientCredential); //KeyVault resource : https://vault.azure.net
        var accessToken = tokenResponse.AccessToken;
        return accessToken;
    }

    var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessToken));
于 2017-05-24T02:51:30.067 回答