次の方法で共有


ASP.NET Core Identity を使用せずにソーシャル サインイン プロバイダー認証を使用する

作成者: Kirk LarkinRick Anderson

ASP.NET Core での Facebook 認証と Google 認証に関する記事には、ユーザーが外部認証プロバイダーからの資格情報で OAuth 2.0 を使用してサインインできるようにする方法が説明されています。 そのトピックで説明されている方法には、ASP.NET Core Identity が認証プロバイダーとして含まれています。

このサンプルでは、ASP.NET Core Identity を使用せずに外部認証プロバイダーを使用する方法を示します。 この方法は、ASP.NET Core Identity のすべての機能を必要としませんが、信頼された外部認証プロバイダーとの統合を引き続き必要とするアプリに便利です。

このサンプルでは、ユーザーの認証に Google 認証を使用します。 Google 認証を使用すると、サインイン プロセスの複雑な管理の多くが Google に移ります。 別の外部認証プロバイダーと統合するには、次の記事を参照してください。

構成

Program.cs で、AddAuthenticationAddCookieAddGoogle の各メソッドを使用して、アプリの認証スキームを構成します。

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.Google;

var builder = WebApplication.CreateBuilder(args);

builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddGoogle(options =>
    {
        options.ClientId = builder.Configuration["Authentication:Google:ClientId"];
        options.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
    });

builder.Services.AddRazorPages();

AddAuthentication を呼び出すと、アプリの DefaultScheme が設定されます。 DefaultScheme は、次の HttpContext 認証拡張メソッドによって使用される既定のスキームです。

アプリの DefaultSchemeCookieAuthenticationDefaults.AuthenticationScheme ("Cookie") に設定すると、これらの拡張メソッドの既定スキームとして Cookie を使うようにアプリが構成されます。 アプリの DefaultChallengeSchemeGoogleDefaults.AuthenticationScheme ("Google") に設定すると、ChallengeAsync に対する呼び出しの既定のスキームとして、Google を使用するようにアプリが構成されます。 DefaultChallengeScheme によって DefaultScheme がオーバーライドされます。 設定時に DefaultScheme をオーバーライドする追加のプロパティについては、AuthenticationOptions を参照してください。

Program.cs で、UseAuthenticationUseAuthorization を呼び出します。 このミドルウェアの組み合わせにより、HttpContext.User プロパティが設定され、要求に対して認可ミドルウェアが実行されます。

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

認証スキームの詳細については、「認証の概念」を参照してください。 cookie 認証の詳細については、ASP.NET Core Identity を使わずに cookie 認証を使う方法に関するページを参照してください。

承認の適用

コントローラー、アクション、またはページに [Authorize] 属性を適用して、アプリの認証構成をテストします。 次のコードによって、認証されたユーザーへの Privacy ページへのアクセスが制限されます。

[Authorize]
public class PrivacyModel : PageModel
{

}

アクセス トークンを保存する

SaveTokens で、認可が成功した後に、アクセス トークンと更新トークンを AuthenticationProperties に格納するかどうかを定義します。 既定では、SaveTokens は、最終的な認証 cookie のサイズを小さくする false に設定されます。

認可が成功した後にアクセス トークンと更新トークンを保存するには、Program.csSaveTokenstrue に設定します。

builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddGoogle(options =>
    {
        options.ClientId = builder.Configuration["Authentication:Google:ClientId"];
        options.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
        options.SaveTokens = true;
    });

保存されたトークンを取得するには、GetTokenAsync を使用します。 次の例では、access_token という名前のトークンを取得しています。

public async Task OnGetAsync()
{
    var accessToken = await HttpContext.GetTokenAsync(
        GoogleDefaults.AuthenticationScheme, "access_token");

    // ...
}

サインアウト

現在のユーザーをサインアウトさせてその cookie を削除するには、SignOutAsync を呼び出します。 次のコードによって、Logout ページに Logout ページ ハンドラーが追加されます。

public class IndexModel : PageModel
{
    public async Task<IActionResult> OnPostLogoutAsync()
    {
        // using Microsoft.AspNetCore.Authentication;
        await HttpContext.SignOutAsync();
        return RedirectToPage();
    }
}

SignOutAsync への呼び出しで認証スキームが指定されていないことに注目してください。 アプリは、フォールバックとして DefaultSchemeCookieAuthenticationDefaults.AuthenticationScheme を使用します。

その他の技術情報

ASP.NET Core での Facebook 認証と Google 認証に関する記事には、ユーザーが外部認証プロバイダーからの資格情報で OAuth 2.0 を使用してサインインできるようにする方法が説明されています。 そのトピックで説明されている方法には、ASP.NET Core Identity が認証プロバイダーとして含まれています。

このサンプルでは、ASP.NET Core Identity を使用せずに外部認証プロバイダーを使用する方法を示します。 この方法は、ASP.NET Core Identity のすべての機能を必要としませんが、信頼された外部認証プロバイダーとの統合を引き続き必要とするアプリに便利です。

このサンプルでは、ユーザーの認証に Google 認証を使用します。 Google 認証を使用すると、サインイン プロセスの複雑な管理の多くが Google に移ります。 別の外部認証プロバイダーと統合するには、次の記事を参照してください。

構成

ConfigureServices メソッドで、AddAuthenticationAddCookieAddGoogle の各メソッドを使用して、アプリの認証スキームを構成します。

public void ConfigureServices(IServiceCollection services)
{
    // requires
    // using Microsoft.AspNetCore.Authentication.Cookies;
    // using Microsoft.AspNetCore.Authentication.Google;
    // NuGet package Microsoft.AspNetCore.Authentication.Google
    services
        .AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
        })
        .AddCookie()
        .AddGoogle(options =>
        {
            options.ClientId = Configuration["Authentication:Google:ClientId"];
            options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
        });

    services.AddRazorPages();
}

AddAuthentication を呼び出すと、アプリの DefaultScheme が設定されます。 DefaultScheme は、次の HttpContext 認証拡張メソッドによって使用される既定のスキームです。

アプリの DefaultSchemeCookieAuthenticationDefaults.AuthenticationScheme ("Cookie") に設定すると、これらの拡張メソッドの既定スキームとして Cookie を使うようにアプリが構成されます。 アプリの DefaultChallengeSchemeGoogleDefaults.AuthenticationScheme ("Google") に設定すると、ChallengeAsync に対する呼び出しの既定のスキームとして、Google を使用するようにアプリが構成されます。 DefaultChallengeScheme によって DefaultScheme がオーバーライドされます。 設定時に DefaultScheme をオーバーライドする追加のプロパティについては、AuthenticationOptions を参照してください。

Startup.Configure では、UseRoutingUseEndpoints の呼び出しの間に UseAuthenticationUseAuthorization を呼び出します。 このミドルウェアの組み合わせにより、HttpContext.User プロパティが設定され、要求に対して認可ミドルウェアが実行されます。

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});

認証スキームの詳細については、「認証の概念」を参照してください。 cookie 認証の詳細については、ASP.NET Core Identity を使わずに cookie 認証を使う方法に関するページを参照してください。

承認の適用

コントローラー、アクション、またはページに [Authorize] 属性を適用して、アプリの認証構成をテストします。 次のコードによって、認証されたユーザーへの Privacy ページへのアクセスが制限されます。

[Authorize]
public class PrivacyModel : PageModel
{

}

サインアウト

現在のユーザーをサインアウトさせてその cookie を削除するには、SignOutAsync を呼び出します。 次のコードによって、Logout ページに Logout ページ ハンドラーが追加されます。

public class IndexModel : PageModel
{
    public async Task<IActionResult> OnPostLogoutAsync()
    {
        await HttpContext.SignOutAsync();
        return RedirectToPage();
    }
}

SignOutAsync への呼び出しで認証スキームが指定されていないことに注目してください。 CookieAuthenticationDefaults.AuthenticationScheme のアプリの DefaultScheme はフォールバックとして使用されます。

その他の技術情報