web-dev-qa-db-ja.com

Azure SDKFluentでの認証トークンの使用

Azure sdk fluent nugetでAzureを使用して認証するには、以下のようにクライアントIDとシークレットを使用する方法があります。

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

以下のコードでIAzureを作成するときに、クライアントIDとシークレットを使用する代わりに認証トークン(JWT)を使用できるインターフェイスはありますか?

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

注:クライアントIDとシークレットを保持し、それらを使用して他のコンポーネント/ SDKで使用される認証トークンを取得する別の認証モジュールがあります。

11
Saravanan

答えは実際にはyesです。認証トークン(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);

ため息...彼らは、ServiceClientCredentialsの代わりにAzureCredentialsを使用するようにWithCredentialsを変更しました。更新されたバージョンは次のとおりです。-

        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);
14
jonny

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);
6
hovsepm

以下のコードでIAzureを作成するときに、クライアントIDとシークレットを使用する代わりに認証トークン(JWT)を使用できるインターフェイスはありますか?

要するにno。私の経験に基づいて、対応するAzureリソースにアクセスする場合は、対応するリソースから認証トークン(JWT)を取得する必要があります。 Azureには、AzureSQL、KeyVault、ResourceManagementなどの多くのリソースがあります。

私のオプションでは、すべてのAzureリソースにアクセスできる認証トークン(JWT)を使用することは意味がありません

現在、AzureCredentials from file、ServicePrincipalLoginInformation、UserLoginInformationを取得できます。

特定のリソースを操作する場合は、認証トークン(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));
0
Tom Sun - MSFT