ASP.NET Core での Google 外部ログインのセットアップ

作成者: Valeriy NovytskyyRick Anderson

このチュートリアルでは、前のページで作成した ASP.NET Core プロジェクトを使用して、ユーザーが自分の Google アカウントでサインインできるようにする方法を示します。

Google OAuth 2.0 クライアント ID とシークレットを作成する

  • Google サインインを Web アプリに統合する」 (Google ドキュメント) のガイダンスに従います。

  • Google API & サービスに移動します。

  • まず、Project が存在している必要があります。作成が必要となる場合があります。 プロジェクトを選択したら、Dashboard を開きます。

  • Dashboard[Oauth consent] (OAuth の同意) 画面で、次の手順を実行します。

    • [User Type - External] (ユーザーの種類 - 外部)[CREATE] (作成) を選択します。
    • [App information] (アプリ情報) ダイアログで、アプリのアプリ名ユーザー サポートのメール アドレス、および開発者の連絡先情報を入力します。
    • スコープの手順をステップ実行します。
    • テスト ユーザーの手順をステップ実行します。
    • [OAuth consent] (OAuth の同意) 画面を確認し、アプリの Dashboard に戻ります。
  • アプリケーションの Dashboard の [Credentials] (資格情報) タブで、[CREATE CREDENTIALS] (資格情報の作成)>[OAuth client ID] (OAuth クライアント ID) の順に選択します。

  • [Application type] (アプリケーションの種類)>[Web application] (Web アプリケーション) を選択し、名前を選択します。

  • [Authorized redirect URIs](承認されたリダイレクト URI) セクションで、 [ADD URI](URI の追加) を選択してリダイレクト URI を設定します。 リダイレクト URI の例: https://localhost:{PORT}/signin-google。ここでの {PORT} プレースホルダーはアプリのポートです。

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

  • アプリの構成で使用するために、クライアント IDクライアント シークレットを保存します。

  • サイトを展開する場合は、次のいずれかを行います。

    • Google コンソールでアプリのリダイレクト URI をアプリのデプロイ済みリダイレクト URI に更新します。
    • Google コンソールで運用環境のリダイレクト URI を使用して、実稼働アプリの新しい Google API 登録を作成します。

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

Secret Manager を使用して、Google のクライアント ID やシークレットの値などの機密設定を格納します。 このサンプルでは、次の手順を使用します。

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

  2. 秘密キーの Authentication:Google:ClientIdAuthentication:Google:ClientSecret を使って、機密設定をローカル シークレット ストアに格納します。

    dotnet user-secrets set "Authentication:Google:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Google:ClientSecret" "<client-secret>"
    

: の区切り記号は、すべてのプラットフォームの環境変数階層キーには対応していません。 __(ダブルアンダースコア)は、

  • すべてのプラットフォームに対応しています。 たとえば、:: の区切り記号には対応していませんが、__ には対応しています。
  • 自動で : に置換されます。

API の資格情報と使用状況は、API コンソールで管理できます。

Google 認証を構成する

アプリに Microsoft.AspNetCore.Authentication.Google NuGet パッケージを追加します。

Startup.ConfigureServices に認証サービスを追加します。

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()
        .AddGoogle(options =>
        {
            IConfigurationSection googleAuthNSection =
                Configuration.GetSection("Authentication:Google");

            options.ClientId = googleAuthNSection["ClientId"];
            options.ClientSecret = googleAuthNSection["ClientSecret"];
        });
}

Program に認証サービスを追加します。

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;

services.AddAuthentication().AddGoogle(googleOptions =>
    {
        googleOptions.ClientId = configuration["Authentication:Google:ClientId"];
        googleOptions.ClientSecret = configuration["Authentication:Google:ClientSecret"];
    });

AddIdentity への呼び出しによって、既定のスキーム設定が構成されます。 AddAuthentication(IServiceCollection, String) オーバーロードは、DefaultScheme プロパティを設定します。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) オーバーロードを使用すると、認証オプションを構成でき、これを使用してさまざまな目的に既定の認証スキームを設定できます。 以降の AddAuthentication への呼び出しで、前に構成した AuthenticationOptions プロパティがオーバーライドされます。

認証ハンドラーを登録する AuthenticationBuilder 拡張メソッドは、認証スキームごとに 1 回のみ呼び出すことができます。 スキームのプロパティ、スキーム名、および表示名の構成を可能にするオーバーロードが存在します。

Google でサインイン

  • アプリを実行し、 [ログイン] を選択します。 Google でサインインするためのオプションが表示されます。
  • [Google] ボタンを選択します。これにより、認証のために Google にリダイレクトされます。
  • Google の認証情報を入力すると、Web サイトにリダイレクトされます。

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

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

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

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

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

複数の認証プロバイダー

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

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

Google 認証でサポートされる構成オプションの詳細については、GoogleOptions API リファレンスを参照してください。 これは、ユーザーに関するさまざまな情報を要求するために使用できます。

既定のコールバック URI を変更する

URI セグメントの /signin-google は、Google 認証プロバイダーの既定のコールバックとして設定されます。 既定のコールバック URI は、GoogleOptions クラスの継承された RemoteAuthenticationOptions.CallbackPath プロパティを使用して Google 認証ミドルウェアを構成する際に変更できます。

トラブルシューティング

  • サインインが機能しない場合にエラーが表示されない場合は、開発モードに切り替えると、問題をデバッグしやすくなります。
  • ConfigureServicesservices.AddIdentity を呼び出して Identity が構成されていない場合、認証しようとすると、"ArgumentException: The 'SignInScheme' オプションを指定する必要があります" になります。 このチュートリアルで使用されているプロジェクト テンプレートを使用すると、Identity が確実に構成されます。
  • 最初の移行を適用してサイト データベースが作成されていない場合は、"要求エラーの処理中にデータベースの操作に失敗しました" が表示されます。 [移行の適用] を選択してデータベースを作成し、ページを更新するとエラーが解消されます。
  • Google などの OAuth 2.0 プロバイダーによる要求の認証に成功した後の HTTP 500 エラー: この GitHub のイシューを参照してください。
  • Google for React や他の SPA アプリによる外部認証を実装する方法: この GitHub のイシューを参照してください。

次の手順

  • この記事では、Google を使って認証する方法について示しました。 同様の方法で、前のページに一覧されている他のプロバイダーでも認証できます。
  • アプリを Azure に発行したら、Google API コンソールで ClientSecret をリセットします。
  • Azure portal で Authentication:Google:ClientIdAuthentication:Google:ClientSecret をアプリケーション設定として設定します。 構成システムは、環境変数からキーを読み取るように設定されています。