ネイティブ アプリケーションまたは Web アプリケーションから BLOB またはキュー データへのアクセスを認可する

Azure Blob Storage または Queue Storage で Azure Active Directory (Azure AD) を使用する主な利点は、資格情報をコード内に格納する必要がなくなることです。 代わりに、Microsoft ID プラットフォームから OAuth 2.0 アクセス トークンを要求することができます。 Azure AD によって、アプリケーションを実行しているセキュリティ プリンシパル (ユーザー、グループ、またはサービス プリンシパル) が認証されます。 認証が成功すると、Azure AD からアプリケーションにアクセス トークンが返されます。アプリケーションでは、このアクセス トークンを使用して Azure Blob Storage および Queue Storage への要求を承認できます。

この記事では、ダウンロード可能なサンプル アプリケーションを使用して、Microsoft ID プラットフォームによる認証を行うためにネイティブ アプリケーションまたは Web アプリケーションを構成する方法について説明します。 サンプル アプリケーションで取り上げられているのは .NET ですが、他の言語でも同様の方法が使用されます。 Microsoft ID プラットフォームの詳細については、「Microsoft ID プラットフォームの概要」を参照してください。

OAuth 2.0 コード付与フローの概要については、「OAuth 2.0 コード付与フローを使用して Azure Active Directory Web アプリケーションへアクセスを承認する」を参照してください。

サンプル アプリケーションについて

このサンプル アプリケーションでは、ローカル開発環境で Azure AD を使用した認証用の Web アプリケーションを構成する方法を示す、エンドツーエンドのエクスペリエンスを提供します。 サンプル アプリケーションを表示して実行するには、最初に GitHub から複製またはダウンロードします。 次に、記事に記載されている手順に従って、Azure アプリの登録を構成し、環境に合わせてアプリケーションを更新します。

Azure AD のセキュリティ プリンシパルにロールを割り当てる

Azure Storage アプリケーションからセキュリティ プリンシパルの認証を行うには、最初に、そのセキュリティ プリンシパルの Azure ロールベースのアクセス制御 (Azure RBAC) 設定を構成します。 コンテナーとキューのアクセス許可を含む組み込みのロールは、Azure Storage によって定義されます。 Azure ロールがセキュリティ プリンシパルに割り当てられると、そのセキュリティ プリンシパルはそのリソースへのアクセス権を付与されます。 詳細については、「BLOB データにアクセスするための Azure ロールを割り当てる」を参照してください。

アプリケーションを Azure AD テナントに登録する

Azure AD を使用してストレージ リソースへのアクセスを承認する最初の手順は、Azure portal からクライアント アプリケーションを Azure AD テナントに登録することです。 クライアント アプリケーションの登録では、使用するアプリケーションに関する情報を Azure AD に提供します。 これで Azure AD から、実行時にアプリケーションを Azure AD と関連付ける際に使用するクライアント ID (アプリケーション ID とも呼ばれます) が提供されます。 クライアント ID の詳細については、「Azure Active Directory のアプリケーション オブジェクトとサービス プリンシパル オブジェクト」を参照してください。 Azure Storage アプリケーションを登録するための手順については、「クイック スタート:Microsoft ID プラットフォームにアプリケーションを登録する」を参照してください。

次の図は、Web アプリケーションを登録するための一般的な設定を示します。 この例では、開発環境でサンプル アプリケーションをテストするために、リダイレクト URI が http://localhost:5000/signin-oidc に設定されていることに注意してください。 この設定は、Azure portal に登録されたアプリケーションに合わせて [認証] 設定を使用して後で変更できます。

Screenshot showing how to register your storage application with Azure AD

Note

アプリケーションをネイティブ アプリケーションとして登録する場合は、リダイレクト URI 用に任意の有効な URI を指定できます。 ネイティブ アプリケーションの場合、この値が実際の URL である必要はありません。 Web アプリケーションの場合、リダイレクト URI はトークンが提供される URL を指定するため、有効な URI である必要があります。

アプリケーションを登録すると、 [設定] にアプリケーション ID (クライアント ID) が表示されます。

Screenshot showing the client ID

Azure AD へのアプリケーションの登録について詳しくは、「Azure Active Directory とアプリケーションの統合」を参照してください。

登録済みのアプリに Azure Storage へのアクセス許可を付与する

次に、Azure Storage API を呼び出すためのアクセス許可をアプリケーションに付与します。 この手順によって、アプリケーションで Azure AD を使用して Azure Storage への要求を承認できるようになります。

  1. 登録済みアプリケーションの [API のアクセス許可] ページで、 [アクセス許可の追加] を選択します。

  2. [Microsoft API] タブで、 [Azure Storage] を選択します。

  3. [API アクセス許可の要求] ペインの [アプリケーションに必要なアクセス許可の種類] で、使用可能なアクセス許可の種類が [委任されたアクセス許可] になっていることを確認してください。 このオプションは既定で選択されています。

  4. [アクセス許可] で、 [user_impersonation] の横にあるチェックボックスをオンにし、 [アクセス許可の追加] ボタンを選択します。

    Screenshot showing permissions for storage API

  5. 次に、 [既定のディレクトリに管理者の同意を与えます] をクリックして、これらのアクセス許可に対する管理者の同意を付与します。

これで、 [API のアクセス許可] ウィンドウに、登録済み Azure AD アプリケーションに Microsoft Graph と Azure Storage の両方の API へのアクセス権があること、およびデフォルト ディレクトリの同意が付与されたことが示されます。 アプリを Azure AD に最初に登録する際に、Microsoft Graph へのアクセス許可が自動的に付与されます。

Screenshot showing API permissions for registered app

クライアント シークレットの作成

アプリケーションでは、トークンを要求するときに ID を証明するためにクライアント シークレットが必要です。 セキュリティ上の理由から、Microsoft は 24 か月を超えるクライアント シークレットの作成を制限しており、これを 12 か月未満の値に設定することを強くお勧めします。 クライアント シークレットを追加するには、次の手順のようにします。

  1. Azure portal でアプリの登録に移動します。

  2. [証明書とシークレット] の設定を選択します。

  3. [クライアント シークレット] で、 [新しいクライアント シークレット] をクリックして新しいシークレットを作成します。

  4. シークレットの説明を入力し、適切な有効期限の間隔を選択します。

  5. すぐに新しいシークレットの値を安全な場所にコピーします。 完全な値は 1 回だけしか表示されません。

    Screenshot showing client secret

暗黙的な許可のフローを有効にする

次に、アプリケーションの暗黙的な許可のフローを構成します。 次の手順に従います。

  1. Azure portal でアプリの登録に移動します。

  2. [管理] セクションで、 [認証] 設定を選択します。

  3. [暗黙の付与] セクションで、次の図のように、チェック ボックスをオンにして ID トークンを有効にします。

    Screenshot showing how to enable settings for implicit grant flow

トークン取得のためのクライアント ライブラリ

アプリケーションを登録し、Azure Blob Storage や Queue Storage 内のデータにアクセスするためのアクセス許可をこれに付与したら、セキュリティ プリンシパルを認証して OAuth 2.0 トークンを取得するためのコードをアプリケーションに追加できます。 認証してトークンを取得するには、Microsoft ID プラットフォームの認証ライブラリまたは OpenID Connect 1.0 をサポートする別のオープンソース ライブラリのいずれかを使用することができます。 その後、アプリケーションはアクセス トークンを使用して、Azure Blob Storage や Queue Storage に対する要求を承認することができます。

トークンの取得がサポートされているシナリオの一覧については、Microsoft Authentication Library (MSAL)認証フローに関するセクションを参照してください。

Azure AD による認証の既知の値

Azure AD でセキュリティ プリンシパルの認証を行うには、いくつかの既知の値をコードに含める必要があります。

Azure AD 機関

Microsoft パブリック クラウドの場合、基本 Azure AD 機関は次のとおりです。ここで、tenant-id は実際の Active Directory テナント ID (またはディレクトリ ID) です。

https://login.microsoftonline.com/<tenant-id>/

テナント ID は、認証に使用する Azure AD テナントを識別します。 ディレクトリ ID とも呼ばれます。 テナント ID を取得するには、Azure portal でアプリ登録の [概要] ページに移動し、そこから値をコピーします。

Azure Storage リソース ID

Azure AD リソース ID は、Azure リソースへのアクセスを与える目的で、発行されたトークンを利用できる対象ユーザーを示します。 Azure Storage の場合、リソース ID は 1 つのストレージ アカウントに固有となるか、あらゆるストレージ アカウントに適用されます。 次の表では、リソース ID に指定できる値の詳細についてまとめています。

Resource ID 説明
https://<account>.blob.core.windows.net

https://<account>.queue.core.windows.net
特定のストレージ アカウントのサービス エンドポイント。 この値を使用し、その特定の Azure Storage アカウントとサービスに対してのみ要求を承認するためのトークンを取得します。 実際のストレージ アカウントの名前に値を置き換えます。
https://storage.azure.com/ あらゆる Azure Storage アカウントへの要求を承認するトークンを取得するために使用します。

.NET コード例: ブロック BLOB を作成する

このコード例では、Azure AD からアクセス トークンを取得する方法を示します。 アクセス トークンは、指定されたユーザーの認証を行って、ブロック BLOB を作成する要求を承認するために使用されます。 このサンプルを動作させるには、まず前のセクションで説明されている手順に従ってください。

トークンを要求するには、アプリの登録から次の値が必要です。

  • Azure AD ドメインの名前。 この値は、Azure Active Directory の [概要] ページから取得します。
  • テナント (またはディレクトリ) ID。 この値は、アプリ登録の [概要] ページから取得します。
  • クライアント (またはアプリケーション) ID。 この値は、アプリ登録の [概要] ページから取得します。
  • クライアント リダイレクト URI。 この値は、アプリ登録の [認証] の設定から取得します。
  • クライアント シークレットの値。 この値は、前にコピーした場所から取得します。

ストレージ アカウントとコンテナーの作成

コード サンプルを実行するには、Azure Active Directory と同じサブスクリプション内にストレージ アカウントを作成します。 次に、そのストレージ アカウント内にコンテナーを作成します。 サンプル コードでは、このコンテナーにブロック BLOB が作成されます。

次に、サンプル コードを実行するユーザー アカウントに、ストレージ BLOB データ共同作成者ロールを明示的に割り当てます。 Azure portal でこのロールを割り当てる方法については、「BLOB データにアクセスするための Azure ロールを割り当てる」を参照してください。

Note

Azure ストレージ アカウントを作成するとき、Azure AD を介してデータにアクセスするためのアクセス許可は自動的に割り当てられません。 Azure Storage の Azure ロールを自分自身に明示的に割り当てる必要があります。 これは、サブスクリプション、リソース グループ、ストレージ アカウント、あるいはコンテナーまたはキューのレベルで割り当てることができます。

データ アクセスのためのロールを自分に割り当てる前に、Azure portal 経由でストレージ アカウントのデータにアクセスできるようになります。これは、Azure portal もデータ アクセスにアカウント キーを使用できるためです。 詳細については、「Azure portal で BLOB データへのアクセスの承認方法を選択する」を参照してください。

Azure AD で Blob Storage へのアクセスを承認する Web アプリケーションを作成する

お使いのアプリケーションで Azure Storage にアクセスするときは、ユーザーの代理として行われます。つまり、BLOB またはキュー リソースには、ログインしているユーザーのアクセス許可を使ってアクセスされます。 このコード例を試すには、ユーザーが Azure AD の ID を使用してサインインすることを示すプロンプトを表示する Web アプリケーションが必要です。 独自に作成することも、Microsoft によって提供されるサンプル アプリケーションを使うこともできます。

トークンを取得し、それを使って Azure Storage に BLOB を作成する完全なサンプル Web アプリケーションは、GitHub で入手できます。 完全なサンプルをレビューして実行すると、コード例の理解に役立つことがあります。 完全なサンプルを実行する方法については、「完全なサンプルを表示して実行する」セクションをご覧ください。

参照と using ステートメントを追加する

Visual Studio から Azure Storage クライアント ライブラリをインストールします。 [ツール] メニューで、 [NuGet パッケージ マネージャー][パッケージ マネージャー コンソール] の順に選択します。 コンソール ウィンドウに次のコマンドを入力して、.NET 用 Azure Storage クライアント ライブラリから必要なパッケージをインストールします。

Install-Package Azure.Storage.Blobs
Install-Package Microsoft.Identity.Web -Version 0.4.0-preview

次に、以下の using ステートメントを HomeController.cs ファイルに追加します。

using Microsoft.Identity.Web; //MSAL library for getting the access token
using Azure.Storage.Blobs;

ブロック BLOB を作成する

次のコード スニペットを追加してブロック BLOB を作成します。 山かっこ内の値は、実際の値に置き換えてください。

private static async Task<string> CreateBlob(TokenAcquisitionTokenCredential tokenCredential)
{
    Uri blobUri = new Uri("https://<storage-account>.blob.core.windows.net/<container>/Blob1.txt");
    BlobClient blobClient = new BlobClient(blobUri, tokenCredential);

    string blobContents = "Blob created by Azure AD authenticated user.";
    byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

    using (MemoryStream stream = new MemoryStream(byteArray))
    {
        await blobClient.UploadAsync(stream);
    }
    return "Blob successfully created";
}

Note

OAuth 2.0 トークンを使用して BLOB とキューの操作を承認するには、HTTPS を使用する必要があります。

上の例では、.NET クライアント ライブラリによって、ブロック BLOB を作成するための要求の認可が処理されます。 他の言語の Azure Storage クライアント ライブラリでも、要求の認可が処理されます。 ただし、REST API を使って OAuth トークンを指定して Azure Storage の操作を呼び出す場合は、OAuth トークンを使って Authorization ヘッダーを作成する必要があります。

OAuth アクセス トークンを使って Blob service および Queue サービスの操作を呼び出すには、ベアラー スキームを使って Authorization ヘッダーでアクセス トークンを渡し、2017-11-09 以降のサービス バージョンを指定します。次の例をご覧ください。

GET /container/file.txt HTTP/1.1
Host: mystorageaccount.blob.core.windows.net
x-ms-version: 2017-11-09
Authorization: Bearer eyJ0eXAiOnJKV1...Xd6j

Azure AD からアクセス トークンを取得する

次に、ユーザーの代わりに Azure AD からトークンを要求するメソッドを追加します。 このメソッドは、アクセス許可が付与されるスコープを定義します。 アクセス許可とスコープの詳細については、「Microsoft ID プラットフォーム エンドポイントでのアクセス許可と同意」を参照してください。

リソース ID を使用して、トークンを取得するスコープを構築します。 この例では、(ユーザーの代わりにトークンが要求されることを示す) 組み込みの user_impersonation スコープと共にリソース ID を使用してスコープを構築します。

注意点としては、自分の代わりにトークンを要求することにユーザーが同意するためのインターフェイスをユーザーに提示することが必要な場合があります。

[AuthorizeForScopes(Scopes = new string[] { "https://storage.azure.com/user_impersonation" })]
public async Task<IActionResult> Blob()
{
    string message = await CreateBlob(new TokenAcquisitionTokenCredential(_tokenAcquisition));
    ViewData["Message"] = message;
    return View();
}

同意は、保護されたリソースにアプリケーションが代理でアクセスする認証を、ユーザーが許可するプロセスです。 Microsoft ID プラットフォームでは増分同意がサポートされています。これは、セキュリティ プリンシパルで最初は最小限のアクセス許可のセットを要求し、必要に応じて時間の経過と共にアクセス許可を追加できることを意味します。 コードがアクセス トークンを要求する場合、アプリが必要とするアクセス許可のスコープを指定します。 増分同意の詳細については、「増分および動的な同意」を参照してください。

完全なサンプルを表示して実行する

サンプル アプリケーションを実行するには、最初に GitHub から複製またはダウンロードします。 その後、以下のセクションで説明するようにアプリケーションを更新します。

設定ファイルで値を提供する

独自の値で appsettings.json ファイルを更新します。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "<azure-ad-domain-name>.onmicrosoft.com",
    "TenantId": "<tenant-id>",
    "ClientId": "<client-id>",
    "ClientSecret": "<client-secret>",
    "ClientCertificates": [
    ],
    "CallbackPath": "/signin-oidc"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

ストレージ アカウントとコンテナー名を更新する

HomeController.cs ファイルで、自分のストレージ アカウントとコンテナーの名前を使うように、ブロック BLOB を参照する URI を更新します。山かっこ内の値を実際の値に置き換えてください。

https://<storage-account>.blob.core.windows.net/<container>/Blob1.txt

次のステップ