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の作成とログインの管理、フル機能の完全な認証プロバイダーは、します。As you've seen in the earlier authentication topics, ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. ただし、cookie ベースの認証時に、独自のカスタム認証ロジックを使用する場合があります。However, you may want to use your own custom authentication logic with cookie-based authentication at times. ASP.NET Core Identity なしのスタンドアロンの認証プロバイダーとしては、cookie ベースの認証を使用できます。You can use cookie-based authentication as a standalone authentication provider without 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 username "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.

ASP.NET Core から移行する cookie ベースの認証の詳細について 1.x から 2.0 への参照認証の移行と ASP.NET Core 2.0 のトピック (Cookie ベースの認証) を Idします。For information on migrating cookie-based authentication from ASP.NET Core 1.x to 2.0, see Migrate Authentication and Identity to ASP.NET Core 2.0 topic (Cookie-based Authentication).

ASP.NET Core Identity を使用する、次を参照してください。、 Id の概要トピック。To use ASP.NET Core Identity, see the Introduction to Identity topic.

構成Configuration

アプリを使用しない場合、 Microsoft.AspNetCore.App メタパッケージ、プロジェクト ファイルでパッケージの参照を作成、 Microsoft.AspNetCore.Authentication.Cookiesパッケージ (バージョン 2.1.0 または後で)。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 (version 2.1.0 or later).

ConfigureServicesメソッドを使用して、認証ミドルウェア サービスを作成、AddAuthenticationAddCookieメソッド。In the 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.

Configureメソッドを使用して、UseAuthenticationを設定する、認証ミドルウェアを呼び出すメソッドをHttpContext.Userプロパティ。In the Configure method, use 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();

AddCookie オプションAddCookie Options

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

オプションOption 説明Description
AccessDeniedPathAccessDeniedPath 302 検出 (URL リダイレクト) を指定するパスを提供してトリガーされたときにHttpContext.ForbidAsyncします。Provides the path to supply with a 302 Found (URL redirect) when triggered by HttpContext.ForbidAsync. 既定値は /Account/AccessDenied です。The default value is /Account/AccessDenied.
ClaimsIssuerClaimsIssuer 使用する発行者、発行者cookie 認証サービスによって作成されたすべての要求のプロパティ。The issuer to use for the Issuer property on any claims created by the cookie authentication service.
Cookie.DomainCookie.Domain ドメイン名は、cookie が処理される場所です。The domain name where the cookie is served. 既定では、要求のホスト名です。By default, this is the host name of the request. ブラウザーはのみ、一致するホスト名に、要求で cookie を送信します。The browser only sends the cookie in requests to a matching host name. このドメインの任意のホストに使用できる cookie を調整することがあります。You may wish to adjust this to have cookies available to any host in your domain. たとえば、クッキーのドメインに設定.contoso.comで使用できるようにcontoso.comwww.contoso.com、およびstaging.www.contoso.comします。For example, setting the cookie domain to .contoso.com makes it available to contoso.com, www.contoso.com, and staging.www.contoso.com.
Cookie.ExpirationCookie.Expiration 取得または cookie の有効期間を設定します。Gets or sets the lifespan of a cookie. 現在、このオプションは機能しませんは ASP.NET Core 2.1 以降では無効になります。Currently, this option no-ops and will become obsolete in ASP.NET Core 2.1+. 使用して、ExpireTimeSpanクッキーの有効期限を設定するオプション。Use the ExpireTimeSpan option to set cookie expiration. 詳細については、次を参照してください。 CookieAuthenticationOptions.Cookie.Expiration の動作が明確します。For more information, see Clarify behavior of CookieAuthenticationOptions.Cookie.Expiration.
Cookie.HttpOnlyCookie.HttpOnly クッキーをサーバーにのみアクセスできる必要があるかどうかを示すフラグです。A flag indicating if the cookie should be accessible only to servers. この値を変更するfalseクッキーにアクセスするクライアント側スクリプトを許可し、アプリが必要 cookie の盗難に、アプリを開くことがあります、クロス サイト スクリプティング (XSS)脆弱性。Changing this value to false permits client-side scripts to access the cookie and may open your app to cookie theft should your app have a Cross-site scripting (XSS) vulnerability. 既定値は true です。The default value is true.
Cookie.NameCookie.Name クッキーの名前を設定します。Sets the name of the cookie.
Cookie.PathCookie.Path 同じホスト名で実行されているアプリを分離するために使用します。Used to isolate apps running on the same host name. 実行中のアプリがあれば/app1cookie をそのアプリに制限を設定して、CookiePathプロパティを/app1します。If you have an app running at /app1 and want to restrict cookies to that app, set the CookiePath property to /app1. これにより、クッキーが要求に使用可能なだけ/app1とその下にあるすべてのアプリ。By doing so, the cookie is only available on requests to /app1 and any app underneath it.
Cookie.SameSiteCookie.SameSite ブラウザーが同じサイトの要求のみに接続する cookie を許可するかどうかを指定 (SameSiteMode.Strict) または安全な HTTP メソッドと同じサイトの要求を使用してサイト間の要求 (SameSiteMode.Lax)。Indicates whether the browser should allow the cookie to be attached to same-site requests only (SameSiteMode.Strict) or cross-site requests using safe HTTP methods and same-site requests (SameSiteMode.Lax). 設定するとSameSiteMode.Nonecookie のヘッダーの値が設定されていません。When set to SameSiteMode.None, the cookie header value isn't set. なおCookie ポリシー ミドルウェア指定した値を上書きする可能性があります。Note that Cookie Policy Middleware might overwrite the value that you provide. 既定値は、OAuth 認証をサポートするSameSiteMode.Laxします。To support OAuth authentication, the default value is SameSiteMode.Lax. 詳細については、次を参照してください。 SameSite cookie のポリシーにより分割 OAuth 認証します。For more information, see OAuth authentication broken due to SameSite cookie policy.
Cookie.SecurePolicyCookie.SecurePolicy 作成された cookie を HTTPS に制限するかどうかを示すフラグ (CookieSecurePolicy.Always)、HTTP または HTTPS (CookieSecurePolicy.None)、または、要求と同じプロトコル (CookieSecurePolicy.SameAsRequest)。A flag indicating if the cookie created should be limited to HTTPS (CookieSecurePolicy.Always), HTTP or HTTPS (CookieSecurePolicy.None), or the same protocol as the request (CookieSecurePolicy.SameAsRequest). 既定値は CookieSecurePolicy.SameAsRequest です。The default value is CookieSecurePolicy.SameAsRequest.
DataProtectionProviderDataProtectionProvider セット、DataProtectionProviderの既定の作成に使用されるTicketDataFormatします。Sets the DataProtectionProvider that's used to create the default TicketDataFormat. 場合、TicketDataFormatプロパティが設定されて、DataProtectionProviderオプションは使用されません。If the TicketDataFormat property is set, the DataProtectionProvider option isn't used. 指定されていない場合は、アプリの既定のデータ保護プロバイダーが使用されます。If not provided, the app's default data protection provider is used.
イベントEvents ハンドラーは、特定の処理ポイントでアプリの制御を提供するプロバイダーのメソッドを呼び出します。The handler calls methods on the provider that give the app control at certain processing points. 場合Eventsメソッドが呼び出されたときに何もしない既定のインスタンスが指定されて、指定されていません。If Events aren't provided, a default instance is supplied that does nothing when the methods are called.
EventsTypeEventsType サービスの種類として取得するために使用、Eventsインスタンス プロパティの代わりにします。Used as the service type to get the Events instance instead of the property.
ExpireTimeSpanExpireTimeSpan TimeSpan Cookie 内に格納された認証チケットが期限切れ後。The TimeSpan after which the authentication ticket stored inside the cookie expires. ExpireTimeSpan チケットの有効期限を作成するには、現在の時刻に追加されます。ExpireTimeSpan is added to the current time to create the expiration time for the ticket. ExpiredTimeSpan値が常に検証サーバーで暗号化された認証チケットに移動します。The ExpiredTimeSpan value always goes into the encrypted AuthTicket verified by the server. 少し可能性があります、 Set-cookieヘッダーが場合にのみ、IsPersistent設定されます。It may also go into the Set-Cookie header, but only if IsPersistent is set. 設定するIsPersistenttrue、構成、 AuthenticationPropertiesに渡されるSignInAsyncします。To set IsPersistent to true, configure the AuthenticationProperties passed to SignInAsync. 既定値のExpireTimeSpanは 14 日間です。The default value of ExpireTimeSpan is 14 days.
LoginPathLoginPath 302 検出 (URL リダイレクト) を指定するパスを提供してトリガーされたときにHttpContext.ChallengeAsyncします。Provides the path to supply with a 302 Found (URL redirect) when triggered by HttpContext.ChallengeAsync. 401 を生成した現在の URL を追加、LoginPathによってという名前のクエリ文字列パラメーターとして、ReturnUrlParameterします。The current URL that generated the 401 is added to the LoginPath as a query string parameter named by the ReturnUrlParameter. 要求を 1 回、LoginPath新しいサインイン id、付与、ReturnUrlParameter値を使用して、元の unauthorized ステータス コードの原因となった URL にブラウザーをリダイレクトします。Once a request to the LoginPath grants a new sign-in identity, the ReturnUrlParameter value is used to redirect the browser back to the URL that caused the original unauthorized status code. 既定値は /Account/Login です。The default value is /Account/Login.
LogoutPathLogoutPath 場合、 LogoutPath 、そのパスに対する要求をリダイレクトし、ハンドラーに提供の値に基づいて、ReturnUrlParameterします。If the LogoutPath is provided to the handler, then a request to that path redirects based on the value of the ReturnUrlParameter. 既定値は /Account/Logout です。The default value is /Account/Logout.
ReturnUrlParameterReturnUrlParameter 302 Found (URL リダイレクト) 応答のハンドラーによって追加されるクエリ文字列パラメーターの名前を指定します。Determines the name of the query string parameter that's appended by the handler for a 302 Found (URL redirect) response. ReturnUrlParameter 要求を受信したときに使用されます、LoginPathまたはLogoutPathログインまたはログアウト アクションが実行された後、元の URL にブラウザーに戻ります。ReturnUrlParameter is used when a request arrives on the LoginPath or LogoutPath to return the browser to the original URL after the login or logout action is performed. 既定値は ReturnUrl です。The default value is ReturnUrl.
SessionStoreSessionStore 要求間で id を格納するために使用するオプションのコンテナー。An optional container used to store identity across requests. 使用すると、セッション識別子のみがクライアントに送信されます。When used, only a session identifier is sent to the client. SessionStore 大規模な id を持つ潜在的な問題を軽減するために使用できます。SessionStore can be used to mitigate potential problems with large identities.
SlidingExpirationSlidingExpiration 更新された期限で新しい cookie を動的に発行するかどうかを示すフラグです。A flag indicating if a new cookie with an updated expiration time should be issued dynamically. これは、現在 cookie の有効期間が 50% 以上の有効期限が切れたすべての要求に対して発生します。This can happen on any request where the current cookie expiration period is more than 50% expired. 新しい有効期限は順方向に移動は、現在の日付を指定するだけでなく、ExpireTimespanします。The new expiration date is moved forward to be the current date plus the ExpireTimespan. 絶対クッキーの有効期限を使用して設定することができます、AuthenticationPropertiesクラスを呼び出すときにSignInAsyncします。An absolute cookie expiration time can be set by using the AuthenticationProperties class when calling SignInAsync. 絶対有効期限は、認証 cookie が有効な時間を制限することで、アプリのセキュリティを強化できます。An absolute expiration time can improve the security of your app by limiting the amount of time that the authentication cookie is valid. 既定値は true です。The default value is true.
TicketDataFormatTicketDataFormat TicketDataFormatを保護し、id と cookie の値に格納されているその他のプロパティの保護を解除するために使用します。The TicketDataFormat is used to protect and unprotect the identity and other properties that are stored in the cookie value. 指定しない場合、TicketDataFormatを使用して作成されて、 DataProtectionProviderします。If not provided, a TicketDataFormat is created using the DataProtectionProvider.
検証Validate オプションが有効であるかをチェックするメソッド。Method that checks that the options are valid.

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

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

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

app.UseCookiePolicy(cookiePolicyOptions);

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

プロパティProperty 説明Description
HttpOnlyHttpOnly Cookie は HttpOnly である必要があります、かどうかをフラグを示すです、クッキーをサーバーにのみアクセスできる必要があるかどうかに影響します。Affects whether cookies must be HttpOnly, which is a flag indicating if the cookie should be accessible only to servers. 既定値は HttpOnlyPolicy.None です。The default value is HttpOnlyPolicy.None.
MinimumSameSitePolicyMinimumSameSitePolicy Cookie の同じサイト属性 (下記参照) に影響します。Affects the cookie's same-site attribute (see below). 既定値は SameSiteMode.Lax です。The default value is SameSiteMode.Lax. このオプションでは、ASP.NET Core 2.0 以降を使用します。This option is available for ASP.NET Core 2.0+.
OnAppendCookieOnAppendCookie Cookie を追加するときに呼び出されます。Called when a cookie is appended.
OnDeleteCookieOnDeleteCookie Cookie が削除されたときに呼び出されます。Called when a cookie is deleted.
セキュリティで保護します。Secure Cookie はセキュリティで保護する必要があるかどうかに影響します。Affects whether cookies must be Secure. 既定値は CookieSecurePolicy.None です。The default value is CookieSecurePolicy.None.

MinimumSameSitePolicy (ASP.NET Core 2.0 以降のみ)MinimumSameSitePolicy (ASP.NET Core 2.0+ only)

既定の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 your 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, you must construct a ClaimsPrincipal. ユーザー情報がシリアル化され、cookie に格納されています。The user information is serialized and stored in the cookie.

作成、 ClaimsIdentity必須要求s と呼び出し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. Required when setting the 
    // ExpireTimeSpan option of CookieAuthenticationOptions 
    // set with AddCookie. Also required when setting 
    // ExpiresUtc.

    //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 you don't specify an AuthenticationScheme, the default scheme is used.

実際には、使用される暗号化とは、ASP.NET Core のデータ保護システム。Under the covers, the encryption used is ASP.NET Core's Data Protection system. 複数のマシン、アプリでの負荷分散または web ファームを使用してアプリをホストしているかどうかは、する必要がありますデータ保護を構成するアプリ id と同じキー リングを使用します。If you're hosting app on multiple machines, load balancing across apps, or using a web farm, then you must 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 you aren't using CookieAuthenticationDefaults.AuthenticationScheme (or "Cookies") as the scheme (for example, "ContosoCookie"), supply the scheme you used when configuring the authentication provider. それ以外の場合、既定のスキームが使用されます。Otherwise, the default scheme is used.

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

Cookie が作成されると、id の 1 つのソースになります。Once a cookie is created, it becomes the single source of identity. バックエンド システムでユーザーを無効にした場合でも、cookie 認証システムは、この知識を持たないし、ユーザーはまだその cookie が有効な限り、ログインしています。Even if you disable a user in your back-end systems, the cookie authentication system has no knowledge of this, and a user stays logged in as long as their cookie is valid.

ValidatePrincipalイベントでは、ASP.NET Core 2.x またはValidateAsync 1.x をインターセプトし、cookie id の検証のオーバーライドに使用できる ASP.NET Core でのメソッド。The ValidatePrincipal event in ASP.NET Core 2.x or the ValidateAsync method in ASP.NET Core 1.x can be used to intercept and override validation of the cookie identity. このアプローチでは、失効したユーザーがアプリにアクセスするリスクを軽減します。This approach 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 has been changed. ユーザーのクッキーが発行されたので、データベースが変更されていない場合、その 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値。To implement this scenario, the database, which is implemented in IUserRepository for this example, stores a LastChanged value. すべてのユーザーが、データベースで更新されたときに、LastChanged値が現在の時刻に設定します。When any 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 you derive from CookieAuthenticationEvents:

ValidatePrincipal(CookieValidatePrincipalContext)

例では、次のようになります。An example looks like the following:

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);
        }
    }
}

クッキーにサービスを登録中に、イベント インスタンスを登録、ConfigureServicesメソッド。Register the events instance during cookie service registration in the 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. これにより、アプリのパフォーマンスが大幅に低下します。This 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" checkbox on login 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.

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

AuthenticationPropertiesでクラスが存在する、Microsoft.AspNetCore.Authentication名前空間。The AuthenticationProperties class resides in the Microsoft.AspNetCore.Authentication namespace.

絶対有効期限を設定するExpiresUtcします。You can set an absolute expiration time with ExpiresUtc. 設定する必要がありますIsPersistent、それ以外のExpiresUtcは無視され、単一セッション cookie が作成されます。You must also set IsPersistent; otherwise, ExpiresUtc is ignored and a single-session cookie is created. ときにExpiresUtcが設定されてSignInAsyncの値よりも優先、ExpireTimeSpanオプションのCookieAuthenticationOptions場合は、設定します。When ExpiresUtc is set on SignInAsync, 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.

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

その他の技術情報Additional resources