Azure App Service には、組み込みの認証 (ユーザーのサインイン) と承認 (セキュリティで保護されたデータへのアクセスを提供する) 機能が用意されています。 これらの機能は、 Easy Auth と呼ばれることもあります。Web アプリ、RESTful API、モバイル サーバー、 および関数でコードをほとんどまたはまったく記述せず、ユーザーのサインインやデータへのアクセスに使用できます。
この記事では、App Service によりアプリの認証と認可を簡略化する方法について説明します。
組み込み認証を使用する理由
認証と承認を実装するには、選択した Web フレームワークにバンドルされたセキュリティ機能を使用するか、独自のツールを記述できます。 認証と承認のためのセキュリティで保護されたソリューションの実装には、多大な労力が必要な場合があります。 業界のベスト プラクティスと標準に従う必要があります。 また、最新のセキュリティ、プロトコル、ブラウザーの更新プログラムを使用して、ソリューションを最新の状態に保つ必要もあります。
App Service と Azure Functions の組み込み機能は、フェデレーション ID プロバイダーですぐに使用できる認証を提供することで、時間と労力を節約できるため、アプリケーションの残りの部分に集中できます。
App Service を使用すると、認証機能を自分で実装しなくても、Web アプリまたは API に統合できます。 この機能はプラットフォームに直接組み込まれており、特定の言語、SDK、セキュリティの専門知識、またはコードは必要ありません。 Microsoft Entra、Facebook、Google、X などの複数のサインイン プロバイダーと統合できます。
アプリでは、Visual Studio の統合や増分同意など、より複雑なシナリオをサポートする必要がある場合があります。 これらのシナリオをサポートするために、いくつかの認証ソリューションを使用できます。 詳細については、 認証のシナリオと推奨事項に関するページを参照してください。
ID プロバイダー
App Service は フェデレーション ID を使用します。 Microsoft または Microsoft 以外の ID プロバイダーが、ユーザー ID と認証フローを自動的に管理します。 次の ID プロバイダーを既定で利用できます。
プロバイダー | サインイン エンドポイント | 使用方法に関するガイダンス |
---|---|---|
Microsoft Entra | /.auth/login/aad |
App Service Microsoft Entra プラットフォームのサインイン |
フェイスブック | /.auth/login/facebook |
App Service Facebook サインイン |
グーグル | /.auth/login/google |
App Service Google サインイン |
X | /.auth/login/x |
App Service X サインイン |
GitHubの | /.auth/login/github |
App Service GitHub サインイン |
林檎 | /.auth/login/apple |
Apple による App Service サインイン (プレビュー) |
任意の OpenID Connect プロバイダー | /.auth/login/<providerName> |
App Service OpenID Connect サインイン |
これらのプロバイダーのいずれかでこの機能を構成すると、そのプロバイダーのサインイン エンドポイントが、ユーザー認証と、プロバイダーからの認証トークンの検証に使用できるようになります。 任意の数のサインイン オプションを、ユーザーに対して提供できます。
組み込みの認証の使用に関する考慮事項
組み込み認証を有効にすると、App Service の構成設定に関係なく、アプリケーションへのすべての要求が HTTPS に自動的にリダイレクトされます。 この自動リダイレクトは、V2 構成の requireHttps
設定を使用して無効にすることができます。 ただし、HTTPS を引き続き使用し、セキュリティで保護されていない HTTP 接続を介してセキュリティ トークンが送信されないようにすることをお勧めします。
App Service を使用して、サイトのコンテンツと API へのアクセスを制限するかどうかにかかわらず、認証を行うことができます。 Web アプリの >>] セクションでアクセス制限を設定します。
- 認証されたユーザーのみにアプリアクセスを制限するには、構成された ID プロバイダーのいずれかでサインイン するように要求が認証されていない場合に実行するアクション を設定します。
- 認証してもアクセスを制限しない場合 は、要求が認証されていないときに実行するアクションを[匿名要求を許可する (アクションなし)] に設定します。
重要
各アプリの登録には、独自のアクセス許可と同意が割り当てられるようにしてください。 デプロイ スロットごとに個別のアプリ登録を使用することで、環境間でアクセス許可を共有することを回避します。 新しいコードをテストする場合、この方法は、問題が運用アプリに影響するのを防ぐのに役立ちます。
しくみ
機能のアーキテクチャ
認証および承認ミドルウェア コンポーネントは、アプリケーションと同じ仮想マシン上で実行されるプラットフォームの機能です。 これを有効にすると、アプリケーションで処理される前に、すべての受信 HTTP 要求がそのコンポーネントを通過します。
プラットフォーム ミドルウェアは、アプリに対していくつかの処理を行います。
- 指定された ID プロバイダーを使用してユーザーとクライアントを認証する
- 構成された ID プロバイダーが発行した OAuth トークンを検証、格納、および更新します
- 認証されたセッションを管理します
- HTTP 要求ヘッダーに ID 情報を挿入する
モジュールは、アプリケーション コードとは別に実行されます。 構成するには、Azure Resource Manager の設定を使用するか 、構成ファイルを使用します。 SDK、特定のプログラミング言語、またはアプリケーション コードの変更は必要ありません。
Windows の機能のアーキテクチャ (コンテナー以外のデプロイ)
認証と認可のモジュールは、アプリケーションと同じサンドボックスでネイティブの IIS モジュールとして実行されます。 これを有効にすると、アプリケーションが処理する前に、すべての受信 HTTP 要求がそれを通過します。
Linux およびコンテナーの機能のアーキテクチャ
認証と承認モジュールは、アプリケーション コードから分離された別のコンテナーで実行されます。 このモジュールでは、 アンバサダー パターン を使用して受信トラフィックと対話し、Windows と同様の機能を実行します。 プロセスでは実行されないため、特定の言語フレームワークとの直接統合は不可能です。 ただし、アプリに必要な関連情報は、要求ヘッダーで渡されます。
認証フロー
認証フローはすべてのプロバイダーで同じです。 プロバイダーの SDK を使用してサインインするかどうかによって異なります。
プロバイダー SDK がない場合: アプリケーションは、フェデレーション サインインを App Service に委任します。 通常、この委任は、プロバイダーのサインイン ページをユーザーに表示できるブラウザー アプリの場合です。 サーバー コードはサインイン プロセスを管理するため、 サーバー向けフロー または サーバー フローとも呼ばれます。
このケースは、認証に埋め込みブラウザーが使用されるブラウザー アプリとモバイル アプリに適用されます。
プロバイダー SDK の場合: アプリケーションはユーザーをプロバイダーに手動でサインインします。 次に、検証のために認証トークンを App Service に送信します。 通常、このプロセスは、プロバイダーのサインイン ページをユーザーに表示できないブラウザーレス アプリの場合です。 アプリケーション コードはサインイン プロセスを管理するため、 クライアント向けフロー または クライアント フローとも呼ばれます。
このケースは、サインイン プロセスの柔軟性を高める必要があるブラウザー アプリに加えて、REST API、 Azure Functions、JavaScript ブラウザー クライアントにも適用されます。 また、プロバイダーの SDK を使用してユーザーをサインインさせるネイティブ モバイル アプリにも適用されます。
App Service の信頼されたブラウザー アプリから App Service または Azure Functions の別の REST API への呼び出しは、サーバー向けフローを通じて認証できます。 詳細については、Azure App Service 認証でのサインインとサインアウトのカスタマイズに関する記事をご覧ください。
次の表は認証フローの手順をまとめたものです。
手順 | プロバイダーの SDK を使わない場合 | プロバイダーの SDK を使う場合 |
---|---|---|
1. ユーザーをサインインする | プロバイダーは、クライアントを /.auth/login/<provider> にリダイレクトします。 |
クライアント コードは、プロバイダーの SDK を使用してユーザーを直接サインインさせ、認証トークンを受け取ります。 詳細については、プロバイダーのドキュメントを参照してください。 |
2.認証後処理を実施する | プロバイダーは、クライアントを /.auth/login/<provider>/callback にリダイレクトします。 |
クライアント コードは、検証のためにプロバイダーからトークンを/.auth/login/<provider> に投稿します。 |
3. 認証済みセッションを確立する | App Service によって、認証された Cookie が応答に追加されます。 | App Service は、独自の認証トークンをクライアント コードに返します。 |
4.認証済みのコンテンツを提供する | クライアントは、後続の要求に認証 Cookie を含めます (ブラウザーによって自動的に処理されます)。 | クライアント コードは、 X-ZUMO-AUTH ヘッダーに認証トークンを提示します。 |
クライアント ブラウザーの場合、App Service は認証されていないすべてのユーザーを /.auth/login/<provider>
に自動的に送ることができます。 また、任意のプロバイダーを使用して、アプリにサインインするための 1 つ以上の /.auth/login/<provider>
リンクをユーザーに提示することもできます。
認可の挙動
Azure portal では、受信要求が認証されていない場合のさまざまな動作で App Service を構成できます。 以降のセクションでは、オプションについて説明します。
重要
既定では、この機能は認証のみを提供し、承認は提供しません。 ここで構成するチェックに加えて、アプリケーションで承認の決定を行う必要がある場合があります。
制限付きアクセス
認証されていない要求を許可する: このオプションは、認証されていないトラフィックの承認をアプリケーション コードに延期します。 認証された要求について、App Service は HTTP ヘッダーで認証情報も渡します。
このオプションでは、匿名要求をいっそう柔軟に処理できます。 たとえば、ユーザーに複数のサインイン プロバイダーを提示することができます。 ただし、コードを記述する必要があります。
認証が必要: このオプションでは、認証されていないとき、アプリケーションへのトラフィックを拒否します。 実行する具体的なアクションについては、この記事の後半の「 認証されていない要求」 セクションで指定します。
このオプションを使用すると、アプリで認証コードを記述する必要はまったくありません。 ユーザーの要求を調べることで、ロール固有の承認など、より細かい承認を処理できます。
注意事項
この方法でのアクセスの制限は、アプリへのすべての呼び出しに適用されますが、これは、多くのシングルページ アプリケーションのように、一般公開されているホーム ページを必要とするアプリには適切でない場合があります。 例外が必要な場合は、 構成ファイルで除外されたパスを構成する必要があります。
注
組織内のユーザーに対して Microsoft ID プロバイダーを使用する場合は、既定の動作として、Microsoft Entra テナント内のどのユーザーでもアプリケーションのトークンを要求できます。 アプリへのアクセスを定義されている一連のユーザーに制限したい場合は、Microsoft Entra でアプリケーションを構成できます。 App Service には、いくつかの検証に役立つ場合がある基本的な組み込み認可チェックも用意されています。 Microsoft Entra での認可について詳しくは、Microsoft Entra の認可の基本に関する記事をご覧ください。
組織内のユーザーに対して Microsoft ID プロバイダーを使用している場合の既定の動作は、Microsoft Entra テナント内のすべてのユーザーがアプリケーションのトークンを要求できることです。 アプリへのアクセスを定義されている一連のユーザーに制限したい場合は、Microsoft Entra でアプリケーションを構成できます。 App Service には、いくつかの検証に役立つ 基本的な組み込み承認チェック も用意されています。 Microsoft Entra での認可について詳しくは、Microsoft Entra の認可の基本に関する記事をご覧ください。
認証されていない要求
-
HTTP 302 Found リダイレクト: ウェブサイトに推奨: 設定されたアイデンティティプロバイダのいずれかにアクションをリダイレクトします。 このような場合、ブラウザー クライアントは、選択したプロバイダーの
/.auth/login/<provider>
にリダイレクトされます。 -
HTTP 401 Unauthorized: API向けに推奨される: 匿名のリクエストがネイティブモバイルアプリから来た場合に、
HTTP 401 Unauthorized
の応答を返します。 また、拒否をすべての要求に対してHTTP 401 Unauthorized
するように構成することもできます。 -
HTTP 403 禁止: すべての要求に対して拒否を
HTTP 403 Forbidden
するように構成します。 -
HTTP 404 Not found: 拒否がすべての要求に対して
HTTP 404 Not found
されるように構成します。
トークン ストア
App Service には、組み込みのトークン ストアが用意されています。 トークン ストアは、Web アプリ、API、またはネイティブ モバイル アプリのユーザーに関連付けられているトークンのリポジトリです。 いずれかのプロバイダーで認証を有効にすると、このトークン ストアはアプリですぐに使用できるようになります。
アプリケーション コードがユーザーの代わりにこれらのプロバイダーのデータにアクセスする必要がある場合は、通常、アプリケーションでこれらのトークンを収集、格納、更新するためのコードを記述する必要があります。 アクションには、次のものが含まれます。
- 認証済みユーザーの Facebook タイムラインに投稿します。
- Microsoft Graph API を使用して、ユーザーの企業データを読み取る。
トークン ストアに関しては、トークンが必要になったらトークンを取得し、トークンが無効になったらトークンを更新するよう App Service に指示するだけです。
ID トークン、アクセス トークン、および更新トークンは、認証されたセッション用にキャッシュされます。 それらにアクセスできるのは、関連付けられているユーザーだけです。
アプリでトークンを操作する必要がない場合は、アプリの >] ページでトークン ストアを無効にすることができます。
ロギングとトレース
アプリケーションのログ記録を有効にすると、認証トレースと承認トレースがログ ファイルに直接表示されます。 予期しない認証エラーが発生した場合は、既存のアプリケーション ログを参照して、すべての詳細を簡単に確認できます。
失敗した要求トレースを有効にした場合、失敗した要求で認証と承認モジュールが果たす可能性があるロールを正確に確認できます。 トレース ログでは、EasyAuthModule_32/64
という名前のモジュールへの参照を探します。
クロスサイト リクエスト フォージェリの軽減策
App Service 認証では、次の条件に対してクライアント要求を検査することで、クロスサイト リクエスト フォージェリが軽減されます。
- これは、セッション Cookie を介して認証された
POST
要求です。 - 要求は、HTTP
User-Agent
ヘッダーによって決定された既知のブラウザーから送信されました。 - HTTP
Origin
ヘッダーまたは HTTPReferer
ヘッダーが見つからないか、リダイレクト用に承認された外部ドメインの構成済みリストに含まれていない。 - HTTP
Origin
ヘッダーが見つからないか、クロスオリジン リソース共有 (CORS) の配信元の構成済みリストに含まれていません。
要求がこれらの条件をすべて満たす場合、App Service 認証によって自動的に拒否されます。 この軽減ロジックを回避するには、設定>認証>編集認証設定>許可された外部リダイレクト URL のリダイレクト リストに外部ドメインを追加します。
Azure Front Door の使用に関する考慮事項
Azure Front Door またはその他のリバース プロキシの背後にある認証で Azure App Service を使用している場合は、次のアクションを検討してください。
Azure Front Door のキャッシュを無効にする
認証ワークフローの Azure Front Door キャッシュ を無効にします。
リダイレクトに Azure Front Door エンドポイントを使用する
App Service は、通常、Azure Front Door によって公開されている場合は直接アクセスできません。 この動作を防ぐには、たとえば、Azure Front Door Premium で Azure Private Link を使用して App Service を公開します。 認証ワークフローがトラフィックを App Service に直接リダイレクトしないようにするため。 詳細については、「 リダイレクト URI」を参照してください。
App Service で適切なリダイレクト URI が使用されていることを確認する
一部の構成では、App Service は Azure Front Door FQDN ではなく、その完全修飾ドメイン名 (FQDN) をリダイレクト URI として使用します。 この構成により、クライアントが Azure Front Door ではなく App Service にリダイレクトされるときに問題が発生します。 これを変更するには、forwardProxy
を Standard
に設定し、Azure Front Door が設定した X-Forwarded-Host
ヘッダーを App Service が考慮するようにします。
Azure Application Gateway や Microsoft 以外の製品などの他のリバース プロキシでは、異なるヘッダーが使用され、別の forwardProxy
設定が必要になる場合があります。
Azure portal を使用して forwardProxy
構成を変更することはできません。
az rest
を使用する必要があります。
設定のエクスポート
az rest --uri /subscriptions/REPLACE-ME-SUBSCRIPTIONID/resourceGroups/REPLACE-ME-RESOURCEGROUP/providers/Microsoft.Web/sites/REPLACE-ME-APPNAME/config/authsettingsV2?api-version=2020-09-01 --method get > auth.json
設定を更新する
検索対象:
"httpSettings": {
"forwardProxy": {
"convention": "Standard"
}
}
convention
が、Azure Front Door で使用されるStandard
ヘッダーを考慮してX-Forwarded-Host
に設定されていることを確認します。
設定のインポート
az rest --uri /subscriptions/REPLACE-ME-SUBSCRIPTIONID/resourceGroups/REPLACE-ME-RESOURCEGROUP/providers/Microsoft.Web/sites/REPLACE-ME-APPNAME/config/authsettingsV2?api-version=2020-09-01 --method put --body @auth.json
関連コンテンツ
App Service 認証の詳細については、次を参照してください。
- Microsoft Entra サインインを使用するように App Service または Azure Functions アプリを構成する
- Azure App Service 認証でのサインインとサインアウトのカスタマイズ
- Azure App Service 認証で OAuth トークンを操作する
- Azure App Service 認証でユーザー ID を操作する
- Azure App Service 認証でのファイル ベースの構成
サンプルについては、以下を参照してください。
- クイック スタート: Azure App Service で実行されている Web アプリにアプリ認証を追加する
- チュートリアル: Azure App Service でエンド ツー エンドでユーザーを認証および承認する
- Azure AppService Easy Auth の .NET Core 統合 (Microsoft 以外の GitHub コンテンツ)
- .NET Core での Azure App Service 認証の使用 (Microsoft 以外の GitHub コンテンツ)