ASP.NET Core Identity なしでの cookie 認証を使用します。Use cookie authentication without ASP.NET Core Identity

によってRick AndersonLuke LathamBy Rick Anderson and Luke Latham

ASP.NET Core Identity は、の作成とログインの管理、フル機能の完全な認証プロバイダーです。ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. ただし、ASP.NET Core Identity なし、cookie ベースの認証の認証プロバイダーを使用できます。However, a cookie-based authentication authentication provider without ASP.NET Core Identity can be used. 詳細については、「 ASP.NET Core Identity の概要 」を参照してください。For more information, see ASP.NET Core Identity の概要.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

サンプル アプリでは、デモンストレーションのための Maria Rodriguez、架空のユーザーのユーザー アカウント、アプリにハードコードしています。For demonstration purposes in the sample app, the user account for the hypothetical user, Maria Rodriguez, is hardcoded into the app. 使用して、電子メールユーザー名maria.rodriguez@contoso.comと、ユーザーがサインインするすべてのパスワード。Use the Email user name maria.rodriguez@contoso.com and any password to sign in the user. における、ユーザーの認証、AuthenticateUserメソッドで、 Pages/Account/Login.cshtml.csファイル。The user is authenticated in the AuthenticateUser method in the Pages/Account/Login.cshtml.cs file. 実際の例では、ユーザーは、データベースに対して認証は。In a real-world example, the user would be authenticated against a database.

構成Configuration

アプリを使用しない場合、 Microsoft.AspNetCore.App メタパッケージ、プロジェクト ファイルでパッケージの参照を作成、 Microsoft.AspNetCore.Authentication.Cookiesパッケージ。If the app doesn't use the Microsoft.AspNetCore.App metapackage, create a package reference in the project file for the Microsoft.AspNetCore.Authentication.Cookies package.

Startup.ConfigureServicesメソッドを使用して、認証ミドルウェア サービスを作成、AddAuthenticationAddCookieメソッド。In the Startup.ConfigureServices method, create the Authentication Middleware service with the AddAuthentication and AddCookie methods:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

AuthenticationScheme 渡されるAddAuthenticationアプリの既定の認証スキームを設定します。AuthenticationScheme passed to AddAuthentication sets the default authentication scheme for the app. AuthenticationScheme cookie 認証の複数のインスタンスがあるし、する場合に便利です特定のスキームで承認します。AuthenticationScheme is useful when there are multiple instances of cookie authentication and you want to authorize with a specific scheme. 設定、AuthenticationSchemeCookieAuthenticationDefaults.AuthenticationSchemeスキームの「クッキー」の値を指定します。Setting the AuthenticationScheme to CookieAuthenticationDefaults.AuthenticationScheme provides a value of "Cookies" for the scheme. スキームを識別する任意の文字列値を指定することができます。You can supply any string value that distinguishes the scheme.

アプリの認証スキームは、アプリの cookie 認証スキームと異なります。The app's authentication scheme is different from the app's cookie authentication scheme. Cookie の認証スキームがときに指定されていませんAddCookieを使用してCookieAuthenticationDefaults.AuthenticationScheme(「クッキー」)。When a cookie authentication scheme isn't provided to AddCookie, it uses CookieAuthenticationDefaults.AuthenticationScheme ("Cookies").

認証 cookie のIsEssentialプロパティに設定されてtrue既定。The authentication cookie's IsEssential property is set to true by default. 認証 cookie は、サイト訪問者がデータの収集に同意していない場合に許可されます。Authentication cookies are allowed when a site visitor hasn't consented to data collection. 詳細については、「 ASP.NET Core での一般データ保護規則 (GDPR) のサポート 」を参照してください。For more information, see ASP.NET Core での一般データ保護規則 (GDPR) のサポート.

Startup.Configureメソッドを呼び出し、UseAuthenticationを設定する、認証ミドルウェアを呼び出すメソッドをHttpContext.Userプロパティ。In the Startup.Configure method, call the UseAuthentication method to invoke the Authentication Middleware that sets the HttpContext.User property. 呼び出す、UseAuthenticationメソッドを呼び出す前にUseMvcWithDefaultRouteまたはUseMvc:Call the UseAuthentication method before calling UseMvcWithDefaultRoute or UseMvc:

app.UseAuthentication();

CookieAuthenticationOptions認証プロバイダーのオプションを構成するクラスを使用します。The CookieAuthenticationOptions class is used to configure the authentication provider options.

設定CookieAuthenticationOptionsでの認証サービスの構成で、Startup.ConfigureServicesメソッド。Set CookieAuthenticationOptions in the service configuration for authentication in the Startup.ConfigureServices method:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        ...
    });

Cookie のポリシーのミドルウェアcookie のポリシーの機能を使用します。Cookie Policy Middleware enables cookie policy capabilities. 機密性の高い順序は、アプリの処理パイプラインにミドルウェアを追加する—下流コンポーネントをパイプラインに登録されているのみに影響します。Adding the middleware to the app processing pipeline is order sensitive—it only affects downstream components registered in the pipeline.

app.UseCookiePolicy(cookiePolicyOptions);

使用CookiePolicyOptionscookie を追加または削除されたとき、cookie 処理ハンドラーに cookie の処理とフックのグローバルの特性を制御する Cookie のポリシーのミドルウェアを提供します。Use CookiePolicyOptions provided to the Cookie Policy Middleware to control global characteristics of cookie processing and hook into cookie processing handlers when cookies are appended or deleted.

既定のMinimumSameSitePolicy値はSameSiteMode.LaxOAuth2 認証を許可するようにします。The default MinimumSameSitePolicy value is SameSiteMode.Lax to permit OAuth2 authentication. 厳密にポリシーを適用する同じサイトのSameSiteMode.Strict、設定、MinimumSameSitePolicyします。To strictly enforce a same-site policy of SameSiteMode.Strict, set the MinimumSameSitePolicy. ただし、この設定は、OAuth2 やその他のクロス オリジンの認証スキームを区切り、クロス オリジン要求の処理に依存しないようにするアプリの他の種類の cookie のセキュリティのレベルを高めます。Although this setting breaks OAuth2 and other cross-origin authentication schemes, it elevates the level of cookie security for other types of apps that don't rely on cross-origin request processing.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

Cookie のポリシーのミドルウェアの設定MinimumSameSitePolicyの設定に影響を与えるCookie.SameSiteCookieAuthenticationOptions次の表に従って設定します。The Cookie Policy Middleware setting for MinimumSameSitePolicy can affect the setting of Cookie.SameSite in CookieAuthenticationOptions settings according to the matrix below.

MinimumSameSitePolicyMinimumSameSitePolicy Cookie.SameSiteCookie.SameSite 最終的な Cookie.SameSite 設定Resultant Cookie.SameSite setting
SameSiteMode.NoneSameSiteMode.None SameSiteMode.NoneSameSiteMode.None
SameSiteMode.LaxSameSiteMode.Lax
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.NoneSameSiteMode.None
SameSiteMode.LaxSameSiteMode.Lax
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.LaxSameSiteMode.Lax SameSiteMode.NoneSameSiteMode.None
SameSiteMode.LaxSameSiteMode.Lax
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.LaxSameSiteMode.Lax
SameSiteMode.LaxSameSiteMode.Lax
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.StrictSameSiteMode.Strict SameSiteMode.NoneSameSiteMode.None
SameSiteMode.LaxSameSiteMode.Lax
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.StrictSameSiteMode.Strict
SameSiteMode.StrictSameSiteMode.Strict

ユーザー情報を保持するクッキーを作成するには、構築、ClaimsPrincipalします。To create a cookie holding user information, construct a ClaimsPrincipal. ユーザー情報がシリアル化され、cookie に格納されています。The user information is serialized and stored in the cookie.

作成、ClaimsIdentity必須Claims と呼び出しSignInAsyncユーザーがサインインします。Create a ClaimsIdentity with any required Claims and call SignInAsync to sign in the user:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.

    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
    // The time at which the authentication ticket expires. A 
    // value set here overrides the ExpireTimeSpan option of 
    // CookieAuthenticationOptions set with AddCookie.

    //IsPersistent = true,
    // Whether the authentication session is persisted across 
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.

    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.

    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http 
    // redirect response value.
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

SignInAsync 暗号化された cookie を作成し、それを現在の応答に追加します。SignInAsync creates an encrypted cookie and adds it to the current response. 場合AuthenticationSchemeが指定されていない、既定のスキームを使用します。If AuthenticationScheme isn't specified, the default scheme is used.

ASP.NET Core のデータ保護システムは、暗号化に使用します。ASP.NET Core's Data Protection system is used for encryption. 複数のマシンでホストされているアプリでは、負荷のアプリケーションで分散や、web ファームを使用してデータ保護を構成する同じキー リングとアプリ id を使用します。For an app hosted on multiple machines, load balancing across apps, or using a web farm, configure data protection to use the same key ring and app identifier.

サインアウトSign out

現在のユーザーをサインアウトし、その cookie を削除、 SignOutAsync:To sign out the current user and delete their cookie, call SignOutAsync:

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

場合CookieAuthenticationDefaults.AuthenticationScheme(または「クッキー」) パターン (たとえば、"ContosoCookie")、認証プロバイダーを構成するときに使用されるスキームを指定するには使用されません。If CookieAuthenticationDefaults.AuthenticationScheme (or "Cookies") isn't used as the scheme (for example, "ContosoCookie"), supply the scheme used when configuring the authentication provider. それ以外の場合、既定のスキームが使用されます。Otherwise, the default scheme is used.

バックエンドの変更に対応します。React to back-end changes

Cookie が作成されると、cookie は、id の 1 つのソースです。Once a cookie is created, the cookie is the single source of identity. バックエンド システムでは、ユーザー アカウントが無効です: 場合If a user account is disabled in back-end systems:

  • アプリの cookie 認証システムは、認証クッキーに基づいて要求を処理が続行されます。The app's cookie authentication system continues to process requests based on the authentication cookie.
  • ユーザーは、認証 cookie が有効な限り、アプリにサインインしたままです。The user remains signed into the app as long as the authentication cookie is valid.

ValidatePrincipalイベントをインターセプトし、cookie id の検証のオーバーライドを使用できます。The ValidatePrincipal event can be used to intercept and override validation of the cookie identity. 失効したユーザーがアプリにアクセスするリスクを軽減する要求ごとに cookie を検証しています。Validating the cookie on every request mitigates the risk of revoked users accessing the app.

Cookie を検証する方法の 1 つは、ユーザー データベースが変更されたときの追跡に基づいています。One approach to cookie validation is based on keeping track of when the user database changes. ユーザーのクッキーが発行されたので、データベースが変更されていない場合、その cookie が有効である場合、ユーザーを再認証する必要はありません。If the database hasn't been changed since the user's cookie was issued, there's no need to re-authenticate the user if their cookie is still valid. サンプル アプリで、データベースが実装されているIUserRepositoryし、格納、LastChanged値。In the sample app, the database is implemented in IUserRepository and stores a LastChanged value. ユーザーが、データベースで更新されたときに、LastChanged値が現在の時刻に設定します。When a user is updated in the database, the LastChanged value is set to the current time.

データベースの変更に基づいている場合は、cookie を無効にするには、LastChanged値には、cookie を作成、LastChanged現在を含む要求LastChangedデータベースから値。In order to invalidate a cookie when the database changes based on the LastChanged value, create the cookie with a LastChanged claim containing the current LastChanged value from the database:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

var claimsIdentity = new ClaimsIdentity(
    claims, 
    CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

オーバーライドを実装するために、ValidatePrincipalイベントから派生したクラスでは、次のシグネチャを持つメソッドを書き込みCookieAuthenticationEvents:To implement an override for the ValidatePrincipal event, write a method with the following signature in a class that derives from CookieAuthenticationEvents:

ValidatePrincipal(CookieValidatePrincipalContext)

実装例を次にCookieAuthenticationEvents:The following is an example implementation of CookieAuthenticationEvents:

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        // Get the database from registered DI services.
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

クッキーにサービスを登録中に、イベント インスタンスを登録、Startup.ConfigureServicesメソッド。Register the events instance during cookie service registration in the Startup.ConfigureServices method. 提供、サービスの登録をスコープCustomCookieAuthenticationEventsクラス。Provide a scoped service registration for your CustomCookieAuthenticationEvents class:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

services.AddScoped<CustomCookieAuthenticationEvents>();

ユーザーの名前が更新される場合を考えてみましょう—判断を任意の方法でセキュリティには影響しません。Consider a situation in which the user's name is updated—a decision that doesn't affect security in any way. 非破壊的ユーザー プリンシパルを更新する場合は、呼び出すcontext.ReplacePrincipal設定と、context.ShouldRenewプロパティをtrueします。If you want to non-destructively update the user principal, call context.ReplacePrincipal and set the context.ShouldRenew property to true.

警告

ここで説明したアプローチは、要求ごとにトリガーされます。The approach described here is triggered on every request. 要求ごとにすべてのユーザーの認証の cookie を検証すると、アプリの大規模なパフォーマンスが低下する可能性があります。Validating authentication cookies for all users on every request can result in a large performance penalty for the app.

永続的な cookiePersistent cookies

Cookie がブラウザー セッション間で永続化することができます。You may want the cookie to persist across browser sessions. この永続化は、明示的なユーザーによる同意を「記憶」のチェック ボックスで、サインインと同様のメカニズムでのみ有効にする必要があります。This persistence should only be enabled with explicit user consent with a "Remember Me" check box on sign in or a similar mechanism.

次のコード スニペットでは、id およびブラウザー クロージャでは存続する対応する cookie を作成します。The following code snippet creates an identity and corresponding cookie that survives through browser closures. 以前に構成された、スライド式有効期限の設定が受け入れられます。Any sliding expiration settings previously configured are honored. ブラウザーに cookie の期限切れのブラウザーが閉じられたときに、再起動の後、cookie をクリアします。If the cookie expires while the browser is closed, the browser clears the cookie once it's restarted.

設定IsPersistenttrueAuthenticationProperties:Set IsPersistent to true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

絶対有効期限を設定できるExpiresUtcします。An absolute expiration time can be set with ExpiresUtc. 永続的な cookie を作成するIsPersistentも設定する必要があります。To create a persistent cookie, IsPersistent must also be set. それ以外の場合、cookie は、セッション ベースの有効期間を持つが作成され前に、または後、保持している認証チケット有効期限が切れる可能性があります。Otherwise, the cookie is created with a session-based lifetime and could expire either before or after the authentication ticket that it holds. ときにExpiresUtcが設定の値がオーバーライドされて、ExpireTimeSpanオプションのCookieAuthenticationOptions場合は、設定します。When ExpiresUtc is set, it overrides the value of the ExpireTimeSpan option of CookieAuthenticationOptions, if set.

次のコード スニペットは、id と対応するクッキーを 20 分間継続を作成します。The following code snippet creates an identity and corresponding cookie that lasts for 20 minutes. これには、以前に構成された、スライド式有効期限の設定が無視されます。This ignores any sliding expiration settings previously configured.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

その他の技術情報Additional resources