Facebook、Google、ASP.NET Core での外部プロバイダーの認証

作成者: Valeriy NovytskyyRick Anderson

このチュートリアルでは、ユーザーが OAuth 2.0 と外部の認証プロバイダーの資格情報を使用してサインインできる、ASP.NET Core アプリを構築する方法について説明します。

以下のセクションでは、FacebookTwitterGoogle、および Microsoft の各プロバイダーを対象とします。また、この記事で作成するスタート プロジェクトを使用します。 他のプロバイダーは、AspNet.Security.OAuth.ProvidersAspNet.Security.OpenId.Providers などのサードパーティ パッケージで利用できます。

既存の資格情報でユーザーがサインインできるようになると:

  • ユーザーにとって便利です。
  • サインイン プロセスの複雑な管理の多くが、サード パーティに移ります。

ソーシャル ログインによってトラフィックとユーザーの変換を促進する方法の例については、Facebook によるケース スタディを参照してください。

新しい .NET Core プロジェクトを作成する

  • 新しいプロジェクトを作成します。
  • [ASP.NET Core Web アプリケーション][次へ] の順に選択します。
  • [プロジェクト名] を指定して、 [場所] を確認または変更します。 [作成] を選択します。
  • ドロップダウン (ASP.NET Core {X.y} ) で ASP.NET Core の最新バージョンを選択し、 [Web アプリケーション] を選択します。
  • [認証] の下で、 [変更] を選択して認証を [個人のユーザー アカウント] に設定します。 [OK] を選択します。
  • [新しい ASP.NET Core Web アプリケーションを作成する] ウィンドウで、 [作成] を選択します。

移行を適用する

  • アプリを実行し、 [登録] リンクを選択します。
  • 新しいアカウントの電子メール アドレスとパスワードを入力し、 [登録] を選択します。
  • 指示に従って移行を適用します。

プロキシまたはロード バランサーによる要求情報の転送

アプリがプロキシ サーバーまたはロード バランサーの背後に展開されると、元の要求情報の一部が要求ヘッダー内でアプリに転送される場合があります。 通常、この情報にはセキュアな要求スキーム (https)、ホスト、およびクライアント IP アドレスが含まれます。 アプリでは、これらの要求ヘッダーを自動的に読み取って、元の要求情報を検出して使用することはありません。

スキームは、外部プロバイダーによる認証フローに影響を及ぼすリンクの生成に使用されます。 セキュアなスキーム (https) が失われると、アプリでは、安全ではない不正なリダイレクト URL が生成されます。

Forwarded Headers Middleware を使用して、アプリが要求を処理する際に元の要求情報を利用できるようにします。

詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。

SecretManager を使用して、ログイン プロバイダーから割り当てられたトークンを格納する

ソーシャル ログイン プロバイダーは、登録プロセス中に アプリケーション ID トークンと アプリケーション シークレット トークンを割り当てます。 完全なトークン名はプロバイダーにより異なります。 これらのトークンは、アプリが API にアクセスするために使用する資格情報を示します。 トークンは、Secret Manager のヘルプにより、アプリの構成にリンクすることが可能な "ユーザー シークレット" になります。 ユーザー シークレットは、 appsettings.json などの構成ファイルにトークンを格納することに代わるより安全な方法です。

重要

Secret Manager は、開発目的のみのためのものです。 Azure Key Vault 構成プロバイダーにより、Azure テストと運用のシークレットを格納し、保護することが可能です。

Safe storage of app secrets in development in ASP.NET Core」(ASP.NET Core での開発中にアプリのシークレットを安全に格納する) トピックの手順に従い、以下の各ログイン プロバイダーから割り当てられたトークンを格納できるようにします。

アプリケーションに必要なログイン プロバイダーをセットアップする

各プロバイダーを使用するようにアプリケーションを構成するには、以下のトピックを参照してください。

複数の認証プロバイダー

アプリが複数のプロバイダーを必要とする場合、AddAuthentication の背後にあるプロバイダーの拡張メソッドをチェインします。

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

必要に応じてパスワードを設定する

外部ログイン プロバイダーに登録するときに、アプリケーションにパスワードは登録していません。 そのため、サイトのパスワードを作成し、記憶する作業は軽減されますが、外部ログイン プロバイダーに依存することにもなります。 外部ログイン プロバイダーを使用できない場合、Web サイトにサインインすることができません。

外部プロバイダーでのサインイン プロセス中に設定した電子メール アドレスを使用して、パスワードを作成し、サインインするには、次の手順を実行します。

  • 右上にある [Hello < 電子メール エイリアス>] リンクを選択して 管理 ビューに移動します。

Web アプリケーションの管理ビュー

  • [作成] を選択します。

パスワード ページを設定する

  • 有効なパスワードを設定します。そのパスワードと電子メール アドレスを使用してサインインできます。

次の手順

  • ログイン ボタンをカスタマイズする方法については、こちらの GitHub イシューを参照してください。
  • このキーの順に押します。では、外部認証プロバイダーを紹介し、外部ログインを ASP.NET Core アプリケーションに追加するために必要な前提条件について説明しました。
  • アプリケーションに必要なプロバイダーのログインを構成するには、各プロバイダーのページを参照してください。
  • ユーザーとそのアクセス トークン許可および更新トークンに関する追加のデータを保持することをお勧めします。 詳細については、「ASP.NET Core で外部プロバイダーからの追加の要求とトークンを保持する」を参照してください。