ASP.NET Core Id 없이 쿠키 인증 사용Use 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)

샘플 앱에서 데모를 위해 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에서 마이그레이션 쿠키 기반 인증에 대 한 내용은 1.x에서 2.0으로 참조 ASP.NET Core 2.0 항목 (쿠키 기반 인증)으로 마이그레이션 인증 및 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 Id를 사용 하려면 참조는 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 쿠키 인증의 인스턴스가 여러 개 있고 하려는 경우에 유용 특정 구성표로 권한 부여합니다.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.

앱의 인증 체계는 앱의 쿠키 인증 체계와 다릅니다.The app's authentication scheme is different from the app's cookie authentication scheme. 쿠키 인증 체계에 제공 되지 않는 경우 AddCookie를 사용 하 여 CookieAuthenticationDefaults.AuthenticationScheme ("쿠키").When a cookie authentication scheme isn't provided to AddCookie, it uses CookieAuthenticationDefaults.AuthenticationScheme ("Cookies").

인증 쿠키가 IsEssential 속성이 true 기본적으로 합니다.The authentication cookie's IsEssential property is set to true by default. 인증 쿠키는 사이트 방문자가 데이터 수집에 동의 하지 않은 경우에 허용 됩니다.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).

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 에 사용할 발급자 합니다 발급자 쿠키 인증 서비스에 의해 만들어진 모든 클레임의 속성입니다.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.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.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 리디렉션) 응답에 대 한 처리기가 추가 되는 쿼리 문자열 매개 변수의 이름을 결정 합니다.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 =>
    {
        ...
    });

ASP.NET Core 1.x에서는 쿠키 미들웨어 암호화 된 쿠키에 사용자 보안 주체를 serialize 하는 합니다.ASP.NET Core 1.x uses cookie middleware that serializes a user principal into an encrypted cookie. 후속 요청에서 쿠키의 유효성을 검사 하 고 주 서버 이며 다시 할당할는 HttpContext.User 속성입니다.On subsequent requests, the cookie is validated, and the principal is recreated and assigned to the HttpContext.User property.

설치 합니다 Microsoft.AspNetCore.Authentication.Cookies 프로젝트에 NuGet 패키지.Install the Microsoft.AspNetCore.Authentication.Cookies NuGet package in your project. 이 패키지는 쿠키 미들웨어를 포함합니다.This package contains the cookie middleware.

사용 하 여는 UseCookieAuthentication 의 메서드를 Configure 에서 메서드 하 Startup.cs 하기 전에 파일 UseMvc 또는 UseMvcWithDefaultRoute:Use the UseCookieAuthentication method in the Configure method in your Startup.cs file before UseMvc or UseMvcWithDefaultRoute:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    AccessDeniedPath = "/Account/Forbidden/",
    AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme,
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    LoginPath = "/Account/Unauthorized/"
});

CookieAuthenticationOptions 옵션CookieAuthenticationOptions Options

합니다 CookieAuthenticationOptions 클래스 인증 공급자 옵션을 구성 하는 데 사용 됩니다.The CookieAuthenticationOptions class is used to configure the authentication provider options.

옵션Option 설명Description
AuthenticationSchemeAuthenticationScheme 인증 체계를 설정합니다.Sets the authentication scheme. AuthenticationScheme 인증의 인스턴스가 여러 개 있고 하려는 경우에 유용 특정 구성표로 권한 부여합니다.AuthenticationScheme is useful when there are multiple instances of 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.
AutomaticAuthenticateAutomaticAuthenticate 쿠키 인증 요청 마다 실행 및 유효성 검사 하 고 만든 직렬화 된 모든 보안 주체를 다시 생성할 수 있는지를 나타내는 값을 설정 합니다.Sets a value to indicate that the cookie authentication should run on every request and attempt to validate and reconstruct any serialized principal it created.
AutomaticChallengeAutomaticChallenge True 이면 인증 미들웨어 자동 과제를 처리 합니다.If true, the authentication middleware handles automatic challenges. 경우 false 이면 인증 미들웨어만 변경 하 여 명시적으로 지정 하는 경우 응답은 AuthenticationScheme합니다.If false, the authentication middleware only alters responses when explicitly indicated by the AuthenticationScheme.
ClaimsIssuerClaimsIssuer 에 사용할 발급자 합니다 발급자 쿠키 인증 미들웨어에서 만든 모든 클레임의 속성입니다.The issuer to use for the Issuer property on any claims created by the cookie authentication middleware.
CookieDomainCookieDomain 쿠키를 제공 하는 도메인 이름입니다.The domain name where the cookie is served. 기본적으로 요청 호스트 이름입니다.By default, this is the host name of the request. 브라우저 쿠키를 일치 하는 호스트 이름 처리합니다.The browser only serves the cookie to a matching host name. 이 도메인의 모든 호스트에 사용할 수 있는 쿠키를 조정 하고자 할 수 있습니다.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.
CookieHttpOnlyCookieHttpOnly 쿠키를 서버에만 액세스할 수 있어야 하는 경우를 나타내는 플래그입니다.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.
CookiePathCookiePath 동일한 호스트 이름에서 실행 중인 앱을 격리 하는 데 사용 합니다.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.
CookieSecureCookieSecure 만들어진 쿠키가 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.
설명Description 앱에 사용할 수 있는 인증 유형에 대 한 추가 정보입니다.Additional information about the authentication type which is made available to the app.
ExpireTimeSpanExpireTimeSpan TimeSpan 인증 티켓이 만료 된 이후입니다.The TimeSpan after which the authentication ticket expires. 티켓에 대 한 만료 기간을 설정 하려면 현재 시간으로 추가 됩니다.It's added to the current time to create the expiration time for the ticket. 사용 하 ExpireTimeSpan를 설정 해야 합니다 IsPersistenttrueAuthenticationProperties 전달할 SignInAsync합니다.To use ExpireTimeSpan, you must set IsPersistent to true in the AuthenticationProperties passed to SignInAsync. 기본값은 14 일입니다.The default value is 14 days.
SlidingExpirationSlidingExpiration 개 중 절반 쿠키 만료 날짜를 다시 설정 하는지 여부를 나타내는 플래그를 ExpireTimeSpan 간격이 경과 합니다.A flag indicating whether the cookie expiration date resets when more than half of the ExpireTimeSpan interval has passed. 새 만료 시간 앞으로 이동 하는 현재 날짜와 ExpireTimespan합니다.The new expiration time 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.

설정할 CookieAuthenticationOptions 에서 쿠키 인증 미들웨어에 대 한는 Configure 메서드:Set CookieAuthenticationOptions for the Cookie Authentication Middleware in the Configure method:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    ...
});

쿠키 정책 미들웨어 앱의 쿠키 정책 기능을 사용 하도록 설정 합니다.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 쿠키는 보안이 적용 되도록 해야 하는지 여부를 영향을 줍니다.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.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.SameSite 에서 CookieAuthenticationOptions 아래 매트릭스에 따라 설정 합니다.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.

만들기는 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. 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 사용자를 로그인 합니다.Call SignInAsync to sign in the user:

await HttpContext.Authentication.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.

로그아웃Sign out

현재 사용자 로그 아웃을 해당 쿠키를 삭제 하려면 호출 SignOutAsync:To sign out the current user and delete their cookie, call SignOutAsync:

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

현재 사용자 로그 아웃을 해당 쿠키를 삭제 하려면 호출 SignOutAsync:To sign out the current user and delete their cookie, call SignOutAsync:

await HttpContext.Authentication.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

쿠키를 만든 후에 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'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.

데이터베이스 변경 내용을 기반으로 하는 경우 쿠키를 무효화 하기 위해 합니다 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>();

에 대 한 재정의 구현 하는 ValidateAsync 이벤트 메서드는 다음 서명 사용 하 여 작성 합니다.To implement an override for the ValidateAsync event, write a method with the following signature:

ValidateAsync(CookieValidatePrincipalContext)

ASP.NET Core Id는이 검사의 일부로 구현 해당 SecurityStampValidator합니다.ASP.NET Core Identity implements this check as part of its SecurityStampValidator. 예제는 다음과 같습니다.An example looks like the following:

public static class LastChangedValidator
{
    public static async Task ValidateAsync(CookieValidatePrincipalContext context)
    {
        // Pull database from registered DI services.
        var userRepository = 
            context.HttpContext.RequestServices
                .GetRequiredService<IUserRepository>();
        var userPrincipal = context.Principal;

        // Look for the last changed 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);
        }
    }
}

쿠키 인증 구성 중 이벤트를 등록 합니다 Configure 메서드:Register the event during cookie authentication configuration in the Configure method:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    Events = new CookieAuthenticationEvents
    {
        OnValidatePrincipal = LastChangedValidator.ValidateAsync
    }
});

사용자의 이름이 업데이트 되는 상황을 가정해 보겠습니다 — 결정 하는 어떤 방식으로 보안에 영향을 주지 않습니다.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" check box 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.

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

합니다 AuthenticationProperties 클래스에 있는 Microsoft.AspNetCore.Http.Authentication 네임 스페이스입니다.The AuthenticationProperties class resides in the Microsoft.AspNetCore.Http.Authentication namespace.

사용 하 여 절대 만료 시간을 설정할 수 있습니다 ExpiresUtc합니다.You can set an absolute expiration time with ExpiresUtc. 영구 쿠키를 만들려면 설정 해야 IsPersistent;이 고, 그렇지 쿠키는 세션 기반 수명을 사용 하 여 생성 되 고 하기 전에 만료 될 있습니다 또는 보유 한 후 인증 티켓입니다.To create a persistent cookie, you must also set IsPersistent; otherwise, the cookie is created with a session-based lifetime and could expire either before or after the authentication ticket that it holds. 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)
    });
await HttpContext.Authentication.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

추가 자료Additional resources