ASP.NET Core Identity 없이 쿠키 인증을 사용 하 여Using Cookie Authentication without ASP.NET Core Identity

Rick AndersonLuke LathamBy Rick Anderson and Luke Latham

이전 인증 항목에 나와 있는 것 처럼 ASP.NET Core Id 만들고 로그인 유지 하기 위한 완전 한 완전 한 기능의 인증 공급자입니다.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. 그러나 다음 쿠키 기반 인증에 사용자 고유의 사용자 지정 인증 논리를 사용 하는 것이 좋습니다.However, you may want to use your own custom authentication logic with cookie-based authentication at times. ASP.NET Core Id 없이 독립 실행형 인증 공급자로 쿠키 기반 인증을 사용할 수 있습니다.You can use cookie-based authentication as a standalone authentication provider without ASP.NET Core Identity.

샘플 코드 보기 또는 다운로드(다운로드 방법)View or download sample code (how to download)

ASP.NET Core에서 마이그레이션 쿠키 기반 인증에 대 한 내용은 2.0으로 1.x 참조 마이그레이션 인증 및 ASP.NET 코어 2.0 (쿠키 기반 인증) 항목에 Id합니다.For information on migrating cookie-based authentication from ASP.NET Core 1.x to 2.0, see Migrating Authentication and Identity to ASP.NET Core 2.0 topic (Cookie-based Authentication).

구성Configuration

사용 하지 않는 경우는 Microsoft.AspNetCore.All metapackage, 버전 2.0 +의 설치는 Microsoft.AspNetCore.Authentication.Cookies NuGet 패키지 합니다.If you aren't using the Microsoft.AspNetCore.All metapackage, install version 2.0+ of the Microsoft.AspNetCore.Authentication.Cookies NuGet package.

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쿠키 인증의 여러 인스턴스가 있고 하려는 경우 유용 특정 스키마를 가진 권한 부여합니다.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 메서드 호출 하기 전에 AddMvcWithDefaultRoute MVC 응용 프로그램 또는 AddMvc Razor 페이지 응용 프로그램에서:Call the UseAuthentication method before calling AddMvcWithDefaultRoute in an MVC app or AddMvc in a Razor Pages app:

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 에 사용할 발급자는 발급자 쿠키 인증 서비스에 의해 만들어진 모든 클레임에 대 한 속성입니다.The issuer to use for the Issuer property on any claims created by the cookie authentication service.
Cookie.DomainCookie.Domain 쿠키 처리 되는 도메인 이름입니다.The domain name where the cookie is served. 기본적으로 요청 호스트 이름입니다.By default, this is the host name of the request. 브라우저 쿠키 요청에서 일치 하는 호스트 이름에만 보냅니다.The browser only sends the cookie in requests to a matching host name. 이 도메인의 모든 호스트에 사용할 수 있는 쿠키를 조정할 수도 있습니다.You may wish to adjust this to have cookies available to any host in your domain. 예를 들어 쿠키 도메인 설정 .contoso.com 를 사용할 수 있도록 contoso.com, www.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 쿠키의 수명을 가져오거나 설정 합니다.Gets or sets the lifespan of a cookie. 현재 아니요 ops 옵션이 고 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 쿠키에 액세스 하는 클라이언트 쪽 스크립트를 허용 하 고 표시 하며 열림 앱이 쿠키 도용 앱 있어야는 교차 사이트 스크립팅 (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. 실행 중인 앱이 있는 경우 /app1 및 해당 응용 프로그램에 쿠키를 제한 하려면 설정는 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 브라우저에서 동일한 사이트 요청에 연결 될 쿠키를 허용 하는지 여부를 나타냅니다 (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.None, 쿠키 헤더 값이 설정 되어 있지 않습니다.When set to SameSiteMode.None, the cookie header value isn't set. 쿠키 정책 미들웨어 제공 하는 값을 덮어쓸 수 있습니다.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 쿠키 정책으로 인해 분할 하는 OAuth 인증합니다.For more information, see OAuth authentication broken due to SameSite cookie policy.
Cookie.SecurePolicyCookie.SecurePolicy 만든 쿠키를 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 쿠키 내부에 저장 된 인증 티켓이 만료 된 이후입니다.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 항상 서버에 의해 확인 된 암호화 된 AuthTicket 값에 들어갑니다.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. 요청을 한 번의 LoginPath 부여 된 새 로그인 id는 ReturnUrlParameter 값 브라우저 원래 권한이 없음된 상태 코드를 발생 시킨 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 (URL 리디렉션) Found 응답에 대 한 처리기가 추가 되는 쿼리 문자열 매개 변수의 이름을 결정 합니다.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 업데이트 된 만료 시간이 새 쿠키를 동적으로 발급 해야 하는 경우를 나타내는 플래그입니다.A flag indicating if a new cookie with an updated expiration time should be issued dynamically. 이 현재 쿠키 만료 기간 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. 절대 만료 시간 인증 쿠키가 유효 하다는 시간의 양을 제한 하 여 응용 프로그램의 보안을 향상 시킬 수 있습니다.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 및 쿠키 값에 저장 되어 있는 기타 속성을 보호 해제 하는 데 사용 됩니다.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 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 쿠키 정책 미들웨어에 제공 된 쿠키를 추가 하거나 삭제할 때 쿠키 처리 처리기에 쿠키 처리 및 후크의 전역 특성을 제어할 수 있습니다.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 쿠키 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 쿠키의 동일한 사이트 특성을 (아래 참조)에 영향을 줍니다.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 에 쿠키를 추가 하는 경우 호출 됩니다.Called when a cookie is appended.
OnDeleteCookieOnDeleteCookie 쿠키가 삭제 되 면 호출 됩니다.Called when a cookie is deleted.
보안Secure 쿠키도 Secure 해야 하는지 여부를 영향을 줍니다.Affects whether cookies must be Secure. 기본값은 CookieSecurePolicy.None입니다.The default value is CookieSecurePolicy.None.

MinimumSameSitePolicy (ASP.NET 코어 2.0 +만)MinimumSameSitePolicy (ASP.NET Core 2.0+ only)

기본 MinimumSameSitePolicy 값은 SameSiteMode.Lax OAuth2 인증을 허용 하도록 합니다.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 및 다른 크로스-원본 인증 체계, 하지만 다른 유형의 크로스-원본 요청을 처리 하지 않아도 되는 앱에 대 한 쿠키 보안 수준을 승격 시킵니다.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,
};

에 대 한 쿠키 정책 미들웨어 설정 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. 사용자 정보 직렬화 되며 쿠키에 저장 됩니다.The user information is serialized and stored in the cookie.

호출 SignInAsync 사용자에 로그인 합니다.Call SignInAsync to sign in the user:

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

SignInAsync암호화 된 쿠키를 만들어 현재 응답에 추가 합니다.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. 여러 컴퓨터, 앱, 부하 분산 또는 웹 팜을 사용 하 여 응용 프로그램을 호스트 하 고 있는 경우 다음을 수행 해야 데이터 보호를 구성 동일한 키 링과 응용 프로그램 식별자를 사용 하도록 합니다.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.

로그 아웃Signing out

로그 아웃 현재 사용자를 해당 쿠키를 삭제 하려면 호출 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.

백 엔드 변경 내용에 응답Reacting to back-end changes

쿠키를 만든 후에 id의 단일 원본이 됩니다.Once a cookie is created, it becomes the single source of identity. 백 엔드 시스템에 사용자를 비활성화 하는 경우에 쿠키 인증 시스템에이 알지 및 해당 쿠키의 유효으로 사용자 로그인 유지 합니다.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 메서드에서 ASP.NET Core 1.x를 가로채 고 쿠키 id의 유효성 검사 재정의에 사용할 수 있습니다.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.

한 가지 방법은 쿠키 유효성 검사를 기반으로 사용자 데이터베이스 변경 된 경우에 추적 합니다.One approach to cookie validation is based on keeping track of when the user database has been changed. 데이터베이스 사용자의 쿠키에 발급 된 이후 변경 되지 않은 경우에 사용자를 해당 쿠키가 여전히 유효한 경우 다시 인증 필요가 없습니다.If the database hasn't been changed since the user's cookie was issued, there is 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.

데이터베이스 변경 내용을 기반으로 하는 경우 쿠키를 무효화 하기 위해는 LastChanged 값, 쿠키와 만들기는 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);
        }
    }
}

쿠키 service 등록 하는 동안 이벤트 인스턴스를 등록 된 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.

영구 쿠키Persistent cookies

쿠키 브라우저 세션 전체에서 유지 하도록 할 수 있습니다.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 및 브라우저 클로저를 통해 되더라도 남아 있지만 해당 쿠키를 만듭니다.The following code snippet creates an identity and corresponding cookie that survives through browser closures. 이전에 구성 된 모든 상대 (sliding) 만료 설정은 적용 됩니다.Any sliding expiration settings previously configured are honored. 쿠키는 브라우저 종료 하는 동안 만료 되 면 다시 시작 되 면 브라우저 쿠키를 지웁니다.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 는 무시 됩니다 단일 세션 쿠키를 생성 됩니다.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. 이 이전에 구성 된 모든 상대 (sliding) 만료 설정을 무시 합니다.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)
    });

참고 항목See also