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で使用される認証トークンを取得する別の認証モジュールがあります。
答えは実際には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);
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);
以下のコードで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));