Azure SDK for .NET を使用した認証

Azure SDK for .NET の最新パッケージでは、共通の認証パッケージを使用して認証します。Azure.Identity です。 Azure.Identity の使用は、このドキュメントの後半で説明する他の認証メカニズムよりも推奨されています。 Azure.Identity から提供される資格情報をサポートするパッケージは Azure.Core を基盤として構築され、Azure で始まるパッケージ識別子が与えられます。 Azure.Core が使用されるパッケージのインベントリについては、パッケージの一覧を参照してください

プロジェクトで Azure.Identity を使用する方法の詳細については、.NET 用 Azure Identity クライアントに関するドキュメントを参照してください。

ヒント

Azure Identity を使用して Azure リソースにアクセスし、管理する例については、「Azure Identity、Resource Management、Storage のサンプル」を参照してください。

Azure.Identity をサポートしないライブラリで認証するには、このトピックの残りを参照してください。

Azure リソースにアクセスする

Key Vault からシークレットを取得したり、Storage に BLOB を保管したりするなど、Azure リソースの操作には、さまざまな Azure サービス ライブラリで認証のための接続文字列やキーが必要になります。 たとえば、SQL Database では標準の SQL 接続文字列が使用されます。 CosmosDBAzure Cache for Redis、および Service Bus などの他の Azure サービスでは、サービス接続文字列が使用されます。 これらの文字列は、Azure portal、CLI、または PowerShell を使用して取得できます。 また、コード内から .NET 用 Azure 管理ライブラリを使い、リソースを照会することによって接続文字列を作成することもできます。

接続文字列の使用方法は製品によって異なります。 こちらの Azure 製品ドキュメントをご覧ください

Azure のリソースを管理する

Azure Management Libraries for .NET を使うには、Azure サブスクリプション内のリソースの読み取りと作成を行うアクセス許可が、.NET アプリケーションに必要です。 サービス プリンシパルを作成し、その資格情報で実行してこのアクセスを許可するようにアプリを構成してください。 サービス プリンシパルによって、自分の ID に関連付けられた非対話型のアカウントを作成し、アプリの実行に必要な権限だけを付与することができます。

まず、Azure Cloud Shell にログインします。 現在、サービス プリンシパル作成対象のサブスクリプションを使用していることを確認します。

az account show

サブスクリプション情報が表示されます。

{
  "environmentName": "AzureCloud",
  "id": "15dbcfa8-4b93-4c9a-881c-6189d39f04d4",
  "isDefault": true,
  "name": "my-subscription",
  "state": "Enabled",
  "tenantId": "43413cc1-5886-4711-9804-8cfea3d1c3ee",
  "user": {
    "cloudShellID": true,
    "name": "jane@contoso.com",
    "type": "user"
  }
}

正しいサブスクリプションにログインしていない場合は、az account set -s <name or ID of subscription> を入力して正しいサブスクリプションを選択します。

次のコマンドを使って、サービス プリンシパルを作成します。

az ad sp create-for-rbac --sdk-auth

サービス プリンシパル情報が JSON として表示されます。

{
  "clientId": "b52dd125-9272-4b21-9862-0be667bdf6dc",
  "clientSecret": "ebc6e170-72b2-4b6f-9de2-99410964d2d0",
  "subscriptionId": "ffa52f27-be12-4cad-b1ea-c2c241b6cceb",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
  "resourceManagerEndpointUrl": "https://management.azure.com/",
  "activeDirectoryGraphResourceId": "https://graph.windows.net/",
  "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
  "galleryEndpointUrl": "https://gallery.azure.com/",
  "managementEndpointUrl": "https://management.core.windows.net/"
}

後で使用できるように、JSON 出力をコピーして、テキスト エディターに貼り付けます。

サービス プリンシパルを作成した後は、リソースを作成および管理するサービス プリンシパルの認証に 2 つのオプションを利用できます。

どちらのオプションでも、次の NuGet パッケージをプロジェクトに追加する必要があります。

Install-Package Microsoft.Azure.Management.Fluent
Install-Package Microsoft.Azure.Management.ResourceManager.Fluent

トークン資格情報で認証を行う

最初の方法では、コードでトークン資格情報オブジェクトを作成します。 構成ファイル、レジストリ、または Azure Key Vault に、資格情報を安全に保存する必要があります。

var credentials = SdkContext.AzureCredentialsFactory
    .FromServicePrincipal(clientId,
        clientSecret,
        tenantId,
        AzureEnvironment.AzureGlobalCloud);

サービス プリンシパル作成時の JSON 出力の clientIdclientSecret、および tenantId 値を使用します。

その後、API を使うためのエントリ ポイントとなる Azure オブジェクトを作成します。

var azure = Microsoft.Azure.Management.Fluent.Azure
    .Configure()
    .Authenticate(credentials)
    .WithDefaultSubscription();

JSON 出力からの subscriptionId を、明示的に Azure オブジェクトに指定することをお勧めします。

var azure = Microsoft.Azure.Management.Fluent.Azure
    .Configure()
    .Authenticate(credentials)
    .WithSubscription(subscriptionId);

ファイルベースの認証

ファイルベースの認証を使うと、プレーンテキスト ファイルにサービス プリンシパルの資格情報を格納し、ファイル システム内で保護できます。

azureauth.json という名前でテキスト ファイルを作成します。 サービス プリンシパル作成時の JSON 出力を貼り付けます。

このファイルは、コードで読み取ることができるシステム上の安全な場所に保存してください。 PowerShell を使用して、AZURE_AUTH_LOCATION という名前の環境変数を設定します。このときに、保存したテキスト ファイルの完全なパスも指定します。次に例を示します。

[Environment]::SetEnvironmentVariable("AZURE_AUTH_LOCATION", "C:\src\azureauth.json", "User")

ファイルの内容を読み取り、API を使うためのエントリ ポイントとなる Azure オブジェクトを作成します。

// pull in the location of the authentication properties file from the environment
var credentials = SdkContext.AzureCredentialsFactory
    .FromFile(Environment.GetEnvironmentVariable("AZURE_AUTH_LOCATION"));

var azure = Microsoft.Azure.Management.Fluent.Azure
    .Configure()
    .Authenticate(credentials)
    .WithDefaultSubscription();