ASP.NET Core を使用した Microsoft アカウント外部ログインのセットアップ
・ヴァレリー・ノヴィツキー・ とリック・アンダーソン
このサンプルでは、前のページ で作成した ASP.NET Core プロジェクトを使用して、ユーザーが職場、学校、または個人の Microsoft アカウントでサインインできるようにする方法示します。
Microsoft Entra 管理センターでアプリを作成する
- Microsoft.AspNetCore.Authentication.MicrosoftAccount NuGet パッケージをプロジェクトに追加します。
- 「アプリケーションを Microsoft ID プラットフォームに登録する 」の手順に従って、Microsoft Entra 管理センターにアプリケーションを登録
クライアント シークレットを作成する
「アプリケーションを Microsoft ID プラットフォームに登録する: 資格情報を追加する」の手順に従って、Microsoft Entra 管理センターでクライアント シークレットを生成します。
Microsoft クライアント ID とシークレットを格納する
前の手順で作成した Microsoft アプリケーション (クライアント) ID や クライアント シークレット などの機密性の高い設定 シークレット マネージャーで保存します。 このサンプルでは、次の手順を使用します。
「シークレット ストレージの を有効にする」の手順従って、シークレット ストレージ用にプロジェクトを初期化します。
秘密キーの
Authentication:Microsoft:ClientId
とAuthentication:Microsoft:ClientSecret
を使用して、機密性の高い設定をローカル シークレット ストアに格納します。<client-id>
は、[アプリケーション (クライアント) IDの下の [Azure アプリの登録] ブレードに表示されます。<client-secret>
は、値として 証明書 & シークレット のリストに表示されており、シークレット IDではありません。dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>" dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
:
区切り記号は、すべてのプラットフォームの環境変数階層キーでは機能しません。 たとえば、:
区切り記号は、Bashではサポートされていません。 ダブル アンダースコア (__
) は:
- すべてのプラットフォームでサポートされています。
- 自動的にコロン、
:
に置き換えられます。
Microsoft アカウント認証を構成する
認証サービスを Program
に追加します。
builder.Services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = configuration["Authentication:Microsoft:ClientId"];
microsoftOptions.ClientSecret = configuration["Authentication:Microsoft:ClientSecret"];
});
AddAuthentication(IServiceCollection, String) オーバーロードは、DefaultScheme プロパティを設定します。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) オーバーロードを使用すると、さまざまな目的で既定の認証スキームを設定するために使用できる認証オプションを構成できます。 AddAuthentication
に対する後続の呼び出しは、以前に構成された AuthenticationOptions プロパティをオーバーライドします。
認証ハンドラーを登録する AuthenticationBuilder 拡張メソッドは、認証スキームごとに 1 回だけ呼び出されます。 スキームのプロパティ、スキーム名、および表示名を構成できるオーバーロードが存在します。
Microsoft アカウント認証でサポートされる構成オプションの詳細については、MicrosoftAccountOptions API リファレンスを参照してください。 これは、ユーザーに関するさまざまな情報を要求するために使用できます。
Microsoft アカウントでサインインする
- アプリを実行し、ログイン選択します。 Microsoft でサインインするためのオプションが表示されます。
- Microsoftでサインインすることを選択して、認証するためにMicrosoftへ移動します。 Microsoft アカウントでサインインすると、アプリに情報へのアクセスを許可するように求められます。
- [はい] を選択して、メールを設定する Web サイトに戻ります。
これで、Microsoft 資格情報を使用してログインします。
複数の認証プロバイダー
アプリで複数のプロバイダーが必要な場合は、AddAuthenticationの背後にあるプロバイダー拡張メソッドをチェーンします。
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions => { ... })
.AddGoogle(googleOptions => { ... })
.AddTwitter(twitterOptions => { ... })
.AddFacebook(facebookOptions => { ... });
プロキシまたはロード バランサーを使用して要求情報を転送する
アプリがプロキシ サーバーまたはロード バランサーの背後にデプロイされている場合、元の要求情報の一部が要求ヘッダーでアプリに転送される可能性があります。 この情報には、通常、セキュリティで保護された要求スキーム (https
)、ホスト、クライアント IP アドレスが含まれます。 アプリは、元の要求情報を検出して使用するために、これらの要求ヘッダーを自動的に読み取りません。
スキームは、外部プロバイダーとの認証フローに影響を与えるリンク生成で使用されます。 セキュリティで保護されたスキーム (https
) を失うと、アプリで不適切な安全でないリダイレクト URL が生成されます。
Forwarded Headers Middleware を使用して、元の要求情報をアプリで要求処理に使用できるようにします。
詳細については、「プロキシ サーバーとロード バランサーで動作するように ASP.NET Core を構成する」を参照してください。
トラブルシューティング
Microsoft アカウント プロバイダーがサインイン エラー ページにリダイレクトする場合は、Uri の
#
(ハッシュタグ) のすぐ後に、エラー タイトルと説明クエリ文字列パラメーターを書き留めます。Microsoft 認証の問題のように見えるエラーメッセージですが、最も一般的な原因は、Web プラットフォームに指定された リダイレクト URIとアプリケーションのURIが一致しないことです。
ConfigureServices
でservices.AddIdentity
を呼び出して Identity が構成されていない場合、認証しようとすると、"ArgumentException: The 'SignInScheme' オプションを指定する必要があります" になります。 このサンプルで使用されるプロジェクト テンプレートを使用すると、これが確実に実行されます。初期移行を適用してサイト データベースが作成されていない場合、要求の処理中にデータベース操作が失敗 エラーが発生します。 [移行の適用] をタップしてデータベースを作成し、更新するとエラーが解消されます。
次の手順
- この記事では、Microsoft で認証する方法について説明しました。 前のページに一覧されている他のプロバイダーで認証する場合も、同様の方法に従ってください。
- Web サイトが Azure Web アプリに発行されたら、Microsoft Entra 管理センターで新しいクライアント シークレットを作成します。
- Microsoft Entra 管理センターでアプリケーション設定として
Authentication:Microsoft:ClientId
とAuthentication:Microsoft:ClientSecret
を設定します。 構成システムは、環境変数からキーを読み取るために設定されます。
このサンプルでは、前のページ で作成した ASP.NET Core 3.0 プロジェクトを使用して、ユーザーが職場、学校、または個人の Microsoft アカウントでサインインできるようにする方法示します。
Microsoft Entra 管理センターでアプリを作成する
- Microsoft.AspNetCore.Authentication.MicrosoftAccount NuGet パッケージをプロジェクトに追加します。
- 「アプリケーションを Microsoft ID プラットフォームに登録する 」の手順に従って、Microsoft Entra 管理センターにアプリケーションを登録
クライアント シークレットを作成する
「アプリケーションを Microsoft ID プラットフォームに登録する: 資格情報を追加する」の手順に従って、Microsoft Entra 管理センターでクライアント シークレットを生成します。
Microsoft クライアント ID とシークレットを格納する
前の手順で作成した Microsoft アプリケーション (クライアント) ID や クライアント シークレット などの機密性の高い設定を、Secret Managerで保存します。 このサンプルでは、次の手順を使用します。
「シークレット ストレージの を有効にする」の手順従って、シークレット ストレージ用にプロジェクトを初期化します。
秘密キーの
Authentication:Microsoft:ClientId
とAuthentication:Microsoft:ClientSecret
を使用して、機密性の高い設定をローカル シークレット ストアに格納します。dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>" dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
:
区切り記号は、すべてのプラットフォームの環境変数階層キーでは機能しません。 たとえば、:
区切り記号は、Bashではサポートされていません。 ダブル アンダースコア (__
) は:
- すべてのプラットフォームでサポートされています。
- 自動的にコロン、
:
に置き換えられます。
Microsoft アカウント認証を構成する
Startup.ConfigureServices
に Microsoft アカウント サービスを追加します。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
});
}
AddAuthentication(IServiceCollection, String) オーバーロードは、DefaultScheme プロパティを設定します。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) オーバーロードを使用すると、さまざまな目的で既定の認証スキームを設定するために使用できる認証オプションを構成できます。 AddAuthentication
に対する後続の呼び出しは、以前に構成された AuthenticationOptions プロパティをオーバーライドします。
認証ハンドラーを登録する AuthenticationBuilder 拡張メソッドは、認証スキームごとに 1 回だけ呼び出されます。 スキームのプロパティ、スキーム名、および表示名を構成できるオーバーロードが存在します。
Microsoft アカウント認証でサポートされる構成オプションの詳細については、MicrosoftAccountOptions API リファレンスを参照してください。 これは、ユーザーに関するさまざまな情報を要求するために使用できます。
Microsoft アカウントでサインインする
アプリを実行し、ログイン選択します。 Microsoft でサインインするためのオプションが表示されます。 Microsoft 選択して、認証のために Microsoft に移動します。 Microsoft アカウントでサインインすると、アプリに情報へのアクセスを許可するように求められます。
[はい をタップすると、メールを設定できる Web サイトにリダイレクトされます。
これで、Microsoft 資格情報を使用してログインします。
複数の認証プロバイダー
アプリで複数のプロバイダーが必要な場合は、AddAuthenticationの背後にあるプロバイダー拡張メソッドをチェーンします。
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions => { ... })
.AddGoogle(googleOptions => { ... })
.AddTwitter(twitterOptions => { ... })
.AddFacebook(facebookOptions => { ... });
プロキシまたはロード バランサーを使用して要求情報を転送する
アプリがプロキシ サーバーまたはロード バランサーの背後にデプロイされている場合、元の要求情報の一部が要求ヘッダーでアプリに転送される可能性があります。 この情報には、通常、セキュリティで保護された要求スキーム (https
)、ホスト、クライアント IP アドレスが含まれます。 アプリは、元の要求情報を検出して使用するために、これらの要求ヘッダーを自動的に読み取りません。
スキームは、外部プロバイダーとの認証フローに影響を与えるリンク生成で使用されます。 セキュリティで保護されたスキーム (https
) を失うと、アプリで不適切な安全でないリダイレクト URL が生成されます。
Forwarded Headers Middleware を使用して、元の要求情報をアプリで要求処理に使用できるようにします。
詳細については、「プロキシ サーバーとロード バランサーで動作するように ASP.NET Core を構成する」を参照してください。
トラブルシューティング
Microsoft アカウント プロバイダーがサインイン エラー ページにリダイレクトする場合は、エラー タイトルと説明クエリ文字列パラメーターを、URI の
#
(ハッシュタグ) のすぐ後に書き留めます。エラーメッセージは Microsoft 認証に問題があることを示しているようですが、最も一般的な原因は、アプリケーション URI が Web プラットフォームに指定された リダイレクト URI と一致していないことです。
ConfigureServices
でservices.AddIdentity
を呼び出して Identity が構成されていない場合、認証しようとすると、"ArgumentException: The 'SignInScheme' オプションを指定する必要があります" になります。 このサンプルで使用されるプロジェクト テンプレートを使用すると、これが確実に実行されます。初期移行を適用してサイト データベースが作成されていない場合は、要求 エラーの処理中にデータベース操作が失敗。 [移行の適用] をタップしてデータベースを作成し、更新するとエラーが解消されます。
次の手順
- この記事では、Microsoft で認証する方法について説明しました。 前のページ に記載されている他のプロバイダーで認証するには、同様の方法に従うことができます。
- Web サイトを Azure Web アプリに発行したら、Microsoft Entra 管理センターで新しいクライアント シークレットを作成します。
- Microsoft Entra 管理センターでアプリケーション設定として
Authentication:Microsoft:ClientId
とAuthentication:Microsoft:ClientSecret
を設定します。 構成システムは、環境変数からキーを読み取るために設定されます。
ASP.NET Core