App Service の認証と承認について詳しく知る

完了

Azure App Service によって、組み込みの認証と承認がサポートされます。 Web アプリ、RESTful API、モバイル バック エンド、Azure Functions において、最小限のコード記述、またはコードなしでユーザーをサインインしてデータにアクセスすることができます。

組み込みの認証を使用する理由

認証と承認に App Service を必ず使う必要はありません。 多くの Web フレームワークにセキュリティ機能がバンドルされており、必要に応じてそれらを使うことができます。 App Service 以上に高い柔軟性が必要な場合は、独自のユーティリティを記述することもできます。

App Service と Azure Functions 用の組み込みの認証機能では、すぐに使用できる認証をフェデレーション ID プロバイダーに提供することで、時間と労力を節約できます。これにより、アプリケーションの残りの部分に専念できます。

  • Azure App Service では、独自に実装せず、さまざまな認証機能を Web アプリまたは API に統合できます。
  • 認証はプラットフォームに直接組み込まれており、特定の言語、SDK、セキュリティの専門知識、コードはどれも必要ありません。
  • 複数のログイン プロバイダーを統合できます。 たとえば、Microsoft Entra ID、Facebook、Google、X などです。

ID プロバイダー

App Service が使用するフェデレーション ID では、サード パーティの ID プロバイダーが代わりにユーザー ID と認証フローを管理します。 次の ID プロバイダーを既定で利用できます。

プロバイダー サインイン エンドポイント 使用方法に関するガイダンス
Microsoft ID プラットフォーム /.auth/login/aad App Service Microsoft ID プラットフォーム ログイン
Facebook /.auth/login/facebook App Service Facebook ログイン
Google /.auth/login/google App Service Google ログイン
x /.auth/login/twitter App Service X ログイン
OpenID Connect プロバイダー /.auth/login/<providerName> App Service OpenID Connect ログイン
GitHub /.auth/login/github App Service GitHub ログイン

これらのプロバイダーのいずれかで認証と認可を有効にすると、そのプロバイダーのサインイン エンドポイントが、ユーザー認証と、プロバイダーからの認証トークンの検証に使用できるようになります。 任意の数のサインイン オプションを、ユーザーに対して提供できます。

しくみ

認証と承認のモジュールは、アプリケーションのコードと同じサンドボックスで実行します。 有効にすると、すべての受信 HTTP 要求がアプリケーション コードに渡される前にこれを通過するようになります。 このモジュールは、アプリのためにいくつかの処理を行います。

  • 特定の ID プロバイダーを使用してユーザーとクライアントを認証する
  • 構成済みの ID プロバイダーによって発行された OAuth トークンの検証、保存、更新を行う
  • 認証されたセッションを管理します
  • HTTP 要求ヘッダーに ID 情報を挿入する

このモジュールは、アプリケーション コードとは別に実行され、Azure Resource Manager の設定または構成ファイルを使用して構成できます。 SDK、特定のプログラミング言語、またはアプリケーション コードの変更は必要ありません。

注意

Linux コンテナーでは、認証と承認のモジュールは、アプリケーションのコードから分離された別のコンテナーで実行されます。 インプロセスでは実行されないため、特定の言語フレームワークと直接統合することはできません。

Authentication flow

認証フローは、プロバイダーによる違いはありませんが、プロバイダーの SDK でサインインするかどうかによって異なります。

  • プロバイダーの SDK を使用しない場合: アプリケーションは、フェデレーション サインインを App Service に委任します。 この委任は通常、ブラウザー アプリで使用され、プロバイダーのログイン ページをユーザーに表示できます。 このサーバー コードはサインイン プロセスを管理し、"サーバー主導フロー" や "サーバー フロー" と呼ばれます。

  • プロバイダーの SDK を使用する場合: アプリケーションは、ユーザーを手動でプロバイダーにサインインさせてから、検証のために App Service に認証トークンを送信します。 これはブラウザーレス アプリで通常のケースであり、プロバイダーのサインイン ページをユーザーに表示することはできません。 このアプリケーション コードはサインイン プロセスを管理し、"クライアント主導フロー" や "クライアント フロー" と呼ばれます。 これは、REST API、Azure Functions、JavaScript ブラウザー クライアント、プロバイダーの SDK を使用してユーザーがサインインするネイティブ モバイル アプリに適用されます。

次の表は認証フローの手順をまとめたものです。

手順 プロバイダーの SDK を使わない場合 プロバイダーの SDK を使う場合
ユーザーをサインインさせる クライアントを /.auth/login/<provider> にリダイレクトします。 クライアント コードはプロバイダーの SDK でユーザーを直接サインインさせ、認証トークンを受け取ります。 詳しくは、プロバイダーのドキュメントをご覧ください。
認証をポストする プロバイダーはクライアントを /.auth/login/<provider>/callback にリダイレクトします。 クライアント コードは検証のためにプロバイダーからのトークンを /.auth/login/<provider> にポストします。
認証済みのセッションを確立する App Service は認証された Cookie を応答に追加します。 App Service は独自の認証トークンをクライアント コードに返します。
認証済みのコンテンツを提供する クライアントは以降の要求に認証クッキーを含めます (ブラウザーによって自動的に処理されます)。 クライアント コードは X-ZUMO-AUTH ヘッダーで認証トークンを提示します (Mobile Apps クライアント SDK によって自動的に処理されます)。

クライアント ブラウザーの場合、App Service は認証されていないすべてのユーザーを /.auth/login/<provider> に自動的に送ることができます。 また、ユーザーが選んだプロバイダーを使ってアプリにサインインするための 1 つまたは複数の /.auth/login/<provider> リンクをユーザーに表示することもできます。

認可の動作

Azure portal では、受信要求が認証されていない場合、App Service でさまざまな動作を構成できます。

  • 認証されていない要求を許可する: このオプションでは、認証されていないトラフィックの承認をアプリケーション コードに委任します。 認証された要求について、App Service は HTTP ヘッダーで認証情報も渡します。 このオプションでは、匿名要求をいっそう柔軟に処理できます。 これにより、複数のサインイン プロバイダーをユーザーに提示できます。

  • 認証が必要: このオプションでは、認証されていないとき、アプリケーションへのトラフィックを拒否します。 この拒否は、構成されているいずれかの ID プロバイダーへのリダイレクト操作になります。 このような場合は、選択したプロバイダーの /.auth/login/<provider> にブラウザー クライアントがリダイレクトされます。 匿名要求がネイティブ モバイル アプリからのものである場合、返される応答は HTTP 401 Unauthorized です。 すべての要求に対して HTTP 401 Unauthorized または HTTP 403 Forbidden になるように拒否を構成することもできます。

    注意事項

    この方法でのアクセスの制限は、アプリへのすべての呼び出しに適用されますが、これは、多くのシングルページ アプリケーションのように、一般公開されているホーム ページを必要とするアプリには適切でない場合があります。

トークン ストア

App Service が提供する組み込みのトークン ストアは、Web アプリ、API、またはネイティブ モバイル アプリのユーザーに関連付けられているトークンのリポジトリです。 いずれかのプロバイダーで認証を有効にすると、このトークン ストアはアプリですぐに使用できるようになります。

ログとトレース

アプリケーション ログを有効にすると、認証と認可のトレースがログ ファイルで直接収集されます。 予期しない認証エラーが発生した場合は、既存のアプリケーション ログを参照して、すべての詳細を簡単に確認できます。