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

作成者: Valeriy NovytskyyRick AndersonBy Valeriy Novytskyy and Rick Anderson

このサンプルでは、 前のページで作成した ASP.NET Core 3.0 プロジェクトを使用して、ユーザーが職場、学校、または personal Microsoft アカウントでサインインできるようにする方法を示します。This sample shows you how to enable users to sign in with their work, school, or personal Microsoft account using the ASP.NET Core 3.0 project created on the previous page.

Microsoft 開発者ポータルでアプリを作成するCreate the app in Microsoft Developer Portal

Microsoft アカウントがない場合は、[ 作成 ] を選択します。If you don't have a Microsoft account, select Create one . サインインすると、[ アプリの登録 ] ページにリダイレクトされます。After signing in, you are redirected to the App registrations page:

  • 新しい登録 の選択Select New registration
  • [名前] を入力します。Enter a Name .
  • サポートされているアカウントの種類 のオプションを選択します。Select an option for Supported account types .
    • パッケージは、 MicrosoftAccount 既定では、"任意の組織ディレクトリ内のアカウント" または "組織ディレクトリと Microsoft アカウントのアカウント" オプションを使用して作成されたアプリ登録をサポートしています。The MicrosoftAccount package supports App Registrations created using "Accounts in any organizational directory" or "Accounts in any organizational directory and Microsoft accounts" options by default.
    • 他のオプションを使用するには、 AuthorizationEndpoint とのメンバーを設定して、 TokenEndpoint MicrosoftAccountOptions 作成後にアプリ登録の [ エンドポイント ] ページに表示される url に Microsoft アカウント認証を初期化します ([ 概要 ] ページの [エンドポイント] をクリックします)。To use other options, set AuthorizationEndpoint and TokenEndpoint members of MicrosoftAccountOptions used to initialize the Microsoft Account authentication to the URLs displayed on Endpoints page of the App Registration after it is created (available by clicking Endpoints on the Overview page).
  • [ リダイレクト URI ] に、追加した開発 URL を入力し /signin-microsoft ます。Under Redirect URI , enter your development URL with /signin-microsoft appended. たとえば、「 https://localhost:5001/signin-microsoft 」のように入力します。For example, https://localhost:5001/signin-microsoft. このサンプルの後半で構成されている Microsoft 認証スキームは、OAuth フローを実装するために、ルートで要求を自動的に処理し /signin-microsoft ます。The Microsoft authentication scheme configured later in this sample will automatically handle requests at /signin-microsoft route to implement the OAuth flow.
  • [登録] を選択しますSelect Register

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

  • 左側のウィンドウで、 [証明書とシークレット] を選択します。In the left pane, select Certificates & secrets .

  • [ クライアントシークレット ] で、[ 新しいクライアントシークレット ] を選択します。Under Client secrets , select New client secret

    • クライアントシークレットの説明を追加します。Add a description for the client secret.
    • [追加] ボタンを選びます。Select the Add button.
  • [ クライアントシークレット ] で、クライアントシークレットの値をコピーします。Under Client secrets , copy the value of the client secret.

URI セグメント /signin-microsoft は、Microsoft 認証プロバイダーの既定のコールバックとして設定されます。The URI segment /signin-microsoft is set as the default callback of the Microsoft authentication provider. MicrosoftAccountOptionsクラスの 継承された[remoteauthenticationoptions]プロパティを使用して Microsoft 認証ミドルウェアを構成するときに、既定のコールバック URI を変更できます。You can change the default callback URI while configuring the Microsoft authentication middleware via the inherited RemoteAuthenticationOptions.CallbackPath property of the MicrosoftAccountOptions class.

Microsoft クライアント ID とシークレットを保存するStore the Microsoft client ID and secret

Microsoft のクライアント ID やシークレットの値など、機微な設定を シークレットマネージャーに保存します。Store sensitive settings such as the Microsoft client ID and secret values with Secret Manager. このサンプルでは、次の手順を使用します。For this sample, use the following steps:

  1. シークレットストレージを有効にする」の手順に従って、シークレットストレージのプロジェクトを初期化します。Initialize the project for secret storage per the instructions at Enable secret storage.

  2. 秘密キーとシークレットキーを使用して、機密設定をローカルシークレットストアに保存 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret ます。Store the sensitive settings in the local secret store with the secret keys Authentication:Microsoft:ClientId and Authentication:Microsoft:ClientSecret:

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

: の区切り記号は、すべてのプラットフォームの環境変数階層キーには対応していません。The : separator doesn't work with environment variable hierarchical keys on all platforms. __(ダブルアンダースコア)は、__, the double underscore, is:

  • すべてのプラットフォームに対応しています。Supported by all platforms. たとえば、Bash: の区切り記号には対応していませんが、__ には対応しています。For example, the : separator is not supported by Bash, but __ is.
  • 自動で : に置換されます。Automatically replaced by a :

Microsoft アカウント認証を構成するConfigure Microsoft Account Authentication

Microsoft アカウントサービスをに追加し Startup.ConfigureServices ます。Add the Microsoft Account service to the 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().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
    });
}

Addauthentication (文字列)オーバーロードは、 defaultschemeプロパティを設定します。The AddAuthentication(String) overload sets the DefaultScheme property. Addauthentication (Action<authenticationoptions>)オーバーロードでは、さまざまな目的で既定の認証方式を設定するために使用できる認証オプションを構成できます。The AddAuthentication(Action<AuthenticationOptions>) overload allows configuring authentication options, which can be used to set up default authentication schemes for different purposes. それ以降のAddAuthentication呼び出しでは、以前に構成されたauthenticationoptionsプロパティがオーバーライドされます。Subsequent calls to AddAuthentication override previously configured AuthenticationOptions properties.

認証ハンドラーを登録するAuthenticationbuilder拡張メソッドは、認証スキームごとに1回だけ呼び出すことができます。AuthenticationBuilder extension methods that register an authentication handler may only be called once per authentication scheme. スキームのプロパティ、スキーム名、および表示名の構成を可能にするオーバーロードが存在します。Overloads exist that allow configuring the scheme properties, scheme name, and display name.

Microsoft アカウント認証でサポートされる構成オプションの詳細については、 MicrosoftAccountOptions API リファレンスを参照してください。For more information about configuration options supported by Microsoft Account authentication, see the MicrosoftAccountOptions API reference. これは、ユーザーに関するさまざまな情報を要求するために使用できます。This can be used to request different information about the user.

Microsoft アカウントでサインインアカウントSign in with Microsoft Account

アプリを実行し、[ ログイン ] をクリックします。Run the app and click Log in . Microsoft でサインインするためのオプションが表示されます。An option to sign in with Microsoft appears. [Microsoft] をクリックすると、認証のために Microsoft にリダイレクトされます。When you click on Microsoft, you are redirected to Microsoft for authentication. Microsoft アカウントでサインインすると、アプリが情報にアクセスできるようにするように求めるメッセージが表示されます。After signing in with your Microsoft Account, you will be prompted to let the app access your info:

[はい] をタップすると、電子メールを設定できる web サイトにリダイレクトされます。Tap Yes and you will be redirected back to the web site where you can set your email.

これで、Microsoft 資格情報を使用してログインしました。You are now logged in using your Microsoft credentials:

複数の認証プロバイダーMultiple authentication providers

アプリが複数のプロバイダーを必要とする場合、AddAuthentication の背後にあるプロバイダーの拡張メソッドをチェインします。When the app requires multiple providers, chain the provider extension methods behind AddAuthentication:

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

プロキシまたはロード バランサーによる要求情報の転送Forward request information with a proxy or load balancer

アプリがプロキシ サーバーまたはロード バランサーの背後に展開されると、元の要求情報の一部が要求ヘッダー内でアプリに転送される場合があります。If the app is deployed behind a proxy server or load balancer, some of the original request information might be forwarded to the app in request headers. 通常、この情報にはセキュアな要求スキーム (https)、ホスト、およびクライアント IP アドレスが含まれます。This information usually includes the secure request scheme (https), host, and client IP address. アプリでは、これらの要求ヘッダーを自動的に読み取って、元の要求情報を検出して使用することはありません。Apps don't automatically read these request headers to discover and use the original request information.

スキームは、外部プロバイダーによる認証フローに影響を及ぼすリンクの生成に使用されます。The scheme is used in link generation that affects the authentication flow with external providers. セキュアなスキーム (https) が失われると、アプリでは、安全ではない不正なリダイレクト URL が生成されます。Losing the secure scheme (https) results in the app generating incorrect insecure redirect URLs.

Forwarded Headers Middleware を使用して、アプリが要求を処理する際に元の要求情報を利用できるようにします。Use Forwarded Headers Middleware to make the original request information available to the app for request processing.

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

トラブルシューティングTroubleshooting

  • Microsoft アカウントプロバイダーによってサインインエラーページが表示された場合は、 # Uri の (ハッシュタグ) のすぐ後にあるエラータイトルと説明のクエリ文字列パラメーターを確認してください。If the Microsoft Account provider redirects you to a sign in error page, note the error title and description query string parameters directly following the # (hashtag) in the Uri.

    エラーメッセージは Microsoft 認証に問題があることを示していますが、最も一般的な原因は、アプリケーション Uri が Web プラットフォームに指定されている リダイレクト uri と一致していないことです。Although the error message seems to indicate a problem with Microsoft authentication, the most common cause is your application Uri not matching any of the Redirect URIs specified for the Web platform.

  • Identityでを呼び出すことによって構成されていない場合 services.AddIdentity ConfigureServices 、認証を試みると ArgumentException が返され ます。 ' SignInScheme ' オプションを指定する必要があり ます。If Identity isn't configured by calling services.AddIdentity in ConfigureServices, attempting to authenticate will result in ArgumentException: The 'SignInScheme' option must be provided . このサンプルで使用するプロジェクトテンプレートにより、この処理が確実に行われます。The project template used in this sample ensures that this is done.

  • 初期移行を適用してサイトデータベースが作成されていない場合は、 要求エラーの処理中にデータベース操作が失敗 します。If the site database has not been created by applying the initial migration, you will get A database operation failed while processing the request error. [ 移行の適用 ] をタップしてデータベースを作成し、更新してエラーを続行します。Tap Apply Migrations to create the database and refresh to continue past the error.

次のステップNext steps

  • この記事では、Microsoft で認証する方法について説明しました。This article showed how you can authenticate with Microsoft. 同様のアプローチに従って、 前のページに一覧表示されている他のプロバイダーとの認証を行うことができます。You can follow a similar approach to authenticate with other providers listed on the previous page.

  • Web サイトを Azure web アプリに発行したら、Microsoft 開発者ポータルで新しいクライアントシークレットを作成します。Once you publish your web site to Azure web app, create a new client secrets in the Microsoft Developer Portal.

  • とを Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret Azure portal のアプリケーション設定として設定します。Set the Authentication:Microsoft:ClientId and Authentication:Microsoft:ClientSecret as application settings in the Azure portal. 構成システムは、環境変数からキーを読み取るように設定されています。The configuration system is set up to read keys from environment variables.