次の方法で共有


ASP.NET Core を使用した Microsoft アカウント外部ログインのセットアップ

・ヴァレリー・ノヴィツキー・ とリック・アンダーソン

このサンプルでは、前のページ で作成した ASP.NET Core プロジェクトを使用して、ユーザーが職場、学校、または個人の Microsoft アカウントでサインインできるようにする方法示します。

Microsoft Entra 管理センターでアプリを作成する

クライアント シークレットを作成する

アプリケーションを Microsoft ID プラットフォームに登録する: 資格情報を追加する」の手順に従って、Microsoft Entra 管理センターでクライアント シークレットを生成します。

Microsoft クライアント ID とシークレットを格納する

前の手順で作成した Microsoft アプリケーション (クライアント) IDクライアント シークレット などの機密性の高い設定 シークレット マネージャーで保存します。 このサンプルでは、次の手順を使用します。

  1. 「シークレット ストレージの を有効にする」の手順従って、シークレット ストレージ用にプロジェクトを初期化します。

  2. 秘密キーの Authentication:Microsoft:ClientIdAuthentication: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が一致しないことです。

  • ConfigureServicesservices.AddIdentity を呼び出して Identity が構成されていない場合、認証しようとすると、"ArgumentException: The 'SignInScheme' オプションを指定する必要があります" になります。 このサンプルで使用されるプロジェクト テンプレートを使用すると、これが確実に実行されます。

  • 初期移行を適用してサイト データベースが作成されていない場合、要求の処理中にデータベース操作が失敗 エラーが発生します。 [移行の適用] をタップしてデータベースを作成し、更新するとエラーが解消されます。

次の手順

  • この記事では、Microsoft で認証する方法について説明しました。 前のページに一覧されている他のプロバイダーで認証する場合も、同様の方法に従ってください。
  • Web サイトが Azure Web アプリに発行されたら、Microsoft Entra 管理センターで新しいクライアント シークレットを作成します。
  • Microsoft Entra 管理センターでアプリケーション設定として Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret を設定します。 構成システムは、環境変数からキーを読み取るために設定されます。

このサンプルでは、前のページ で作成した ASP.NET Core 3.0 プロジェクトを使用して、ユーザーが職場、学校、または個人の Microsoft アカウントでサインインできるようにする方法示します。

Microsoft Entra 管理センターでアプリを作成する

クライアント シークレットを作成する

アプリケーションを Microsoft ID プラットフォームに登録する: 資格情報を追加する」の手順に従って、Microsoft Entra 管理センターでクライアント シークレットを生成します。

Microsoft クライアント ID とシークレットを格納する

前の手順で作成した Microsoft アプリケーション (クライアント) IDクライアント シークレット などの機密性の高い設定を、Secret Managerで保存します。 このサンプルでは、次の手順を使用します。

  1. 「シークレット ストレージの を有効にする」の手順従って、シークレット ストレージ用にプロジェクトを初期化します。

  2. 秘密キーの Authentication:Microsoft:ClientIdAuthentication: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 と一致していないことです。

  • ConfigureServicesservices.AddIdentity を呼び出して Identity が構成されていない場合、認証しようとすると、"ArgumentException: The 'SignInScheme' オプションを指定する必要があります" になります。 このサンプルで使用されるプロジェクト テンプレートを使用すると、これが確実に実行されます。

  • 初期移行を適用してサイト データベースが作成されていない場合は、要求 エラーの処理中にデータベース操作が失敗[移行の適用] をタップしてデータベースを作成し、更新するとエラーが解消されます。

次の手順

  • この記事では、Microsoft で認証する方法について説明しました。 前のページ に記載されている他のプロバイダーで認証するには、同様の方法に従うことができます
  • Web サイトを Azure Web アプリに発行したら、Microsoft Entra 管理センターで新しいクライアント シークレットを作成します。
  • Microsoft Entra 管理センターでアプリケーション設定として Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret を設定します。 構成システムは、環境変数からキーを読み取るために設定されます。