인증을 사용 cookie 하지 않고 사용 ASP.NET Core IdentityUse cookie authentication without ASP.NET Core Identity

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core Identity 는 로그인을 만들고 유지 관리 하기 위한 완전 한 기능을 갖춘 완전 한 인증 공급자입니다.ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. 그러나를 cookie 사용 하지 않는 기반 인증 공급자를 ASP.NET Core Identity 사용할 수 있습니다.However, a cookie-based 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)

샘플 앱의 데모용으로, 가상 사용자 (민 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 address maria.rodriguez@contoso.com and any password to sign in the user. 사용자는 AuthenticateUser Pages/Account/Login. cshtml 파일의 메서드에서 인증 됩니다.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.

ConfigurationConfiguration

Startup.ConfigureServices메서드에서 및 메서드를 사용 하 여 인증 미들웨어 서비스를 AddAuthentication 만듭니다 AddCookie .In the Startup.ConfigureServices method, create the Authentication Middleware services 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. AuthenticationScheme Cookie authenticationdefaults로 설정 합니다. authenticationdefaults 은 Cookie 스키마에 대해 "s" 값을 제공 합니다.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 (" Cookie s")를 사용 합니다.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 호출 UseAuthorization 하 여 속성을 설정 하 HttpContext.User 고 요청에 대 한 권한 부여 미들웨어를 실행 합니다.In Startup.Configure, call UseAuthentication and UseAuthorization to set the HttpContext.User property and run Authorization Middleware for requests. UseAuthenticationUseAuthorization 호출 하기 전에 및 메서드를 호출 합니다 UseEndpoints .Call the UseAuthentication and UseAuthorization methods before calling UseEndpoints:

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

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

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 Policy Middleware

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

CookiePolicyOptions정책 미들웨어에 제공 된를 사용 Cookie 하 여 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.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 및 다른 크로스-원본 인증 스키마를 중단 하지만 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.SameSite CookieAuthenticationOptions 아래 행렬에 따라 설정의 설정에 영향을 줄 수 있습니다.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

인증 만들기 cookieCreate an authentication cookie

cookie보유 사용자 정보를 만들려면를 구성 ClaimsPrincipal 합니다.To create a cookie holding user information, construct a ClaimsPrincipal. 사용자 정보는 serialize 되 고에 저장 됩니다 cookie .The user information is serialized and stored in the cookie.

필요한를 사용 하 여를 만들고를 ClaimsIdentity Claim 호출 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);

영어 이외의 언어로 번역된 코드 주석을 보려면 이 GitHub 토론 이슈에서 알려주세요.If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.

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.

RedirectUri 는 기본적으로 몇 가지 특정 경로 (예: 로그인 경로 및 로그 아웃 경로) 에서만 사용 됩니다.RedirectUri is only used on a few specific paths by default, for example, the login path and logout paths. 자세한 내용은 Cookie authenticationhandler 원본을 참조 하세요.For more information see the CookieAuthenticationHandler source.

ASP.NET Core의 데이터 보호 시스템이 암호화에 사용 됩니다.ASP.NET Core's Data Protection system is used for encryption. 여러 컴퓨터에서 호스트 되는 앱의 경우, 앱 간에 부하를 분산 하거나 웹 팜을 사용 하 여 데이터 보호를 구성 하 여 동일한 키 링 및 앱 식별자를 사용 하도록 구성 합니다.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(또는 " Cookie s")가 구성표 (예: "Contoso")로 사용 되지 않는 경우 Cookie 인증 공급자를 구성할 때 사용 되는 체계를 제공 합니다.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.

브라우저가 닫히면 세션 기반 cookie s (비영구 s)가 자동으로 삭제 cookie 되지만 cookie 개별 탭이 닫히면 s는 제거 되지 않습니다.When the browser closes it automatically deletes session based cookies (non-persistent cookies), but no cookies are cleared when an individual tab is closed. 서버에 탭 또는 브라우저 닫기 이벤트에 대 한 알림이 표시 되지 않습니다.The server is not notified of tab or browser close events.

백 엔드 변경 내용에 대응React to back-end changes

가 cookie 만들어지면는 cookie id의 단일 원본입니다.Once a cookie is created, the cookie is the single source of identity. 백 엔드 시스템에서 사용자 계정을 사용할 수 없는 경우:If a user account is disabled in back-end systems:

  • 앱의 cookie 인증 시스템은 인증에 따라 요청을 계속 처리 합니다 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이벤트를 사용 하 여 id의 유효성 검사를 가로채 고 재정의할 수 있습니다 cookie .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 사용자 데이터베이스가 변경 되는 시기를 추적 하는 것입니다.One approach to cookie validation is based on keeping track of when the user database changes. 사용자가 발급 된 이후에 데이터베이스가 변경 되지 않은 경우에 cookie 도 해당 사용자를 다시 인증할 필요가 없습니다 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);
        }
    }
}

메서드에서 서비스를 등록 하는 동안 events 인스턴스를 등록 cookie 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. 사용자 보안 주체를 destructively 업데이트 하려면를 호출 하 context.ReplacePrincipalcontext.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.

영구 cookie sPersistent 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.

IsPersistent에서로 설정 합니다 true AuthenticationProperties .Set IsPersistent to true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

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

절대 cookie 만료Absolute cookie expiration

절대 만료 시간은를 사용 하 여 설정할 수 있습니다 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를 만들고 해당 id를 cookie 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)
    });

ASP.NET Core Identity 는 로그인을 만들고 유지 관리 하기 위한 완전 한 기능을 갖춘 완전 한 인증 공급자입니다.ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. 그러나를 cookie 사용 하지 않는 기반 인증 공급자를 ASP.NET Core Identity 사용할 수 있습니다.However, a cookie-based 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)

샘플 앱의 데모용으로, 가상 사용자 (민 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 address maria.rodriguez@contoso.com and any password to sign in the user. 사용자는 AuthenticateUser Pages/Account/Login. cshtml 파일의 메서드에서 인증 됩니다.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.

ConfigurationConfiguration

앱이 AspNetCore 메타 패키지를 사용 하지 않는 경우 프로젝트 파일에서 AspNetCore Cookie 에 대 한 패키지 참조를 만듭니다. s 패키지.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메서드에서 및 메서드를 사용 하 여 인증 미들웨어 서비스를 AddAuthentication 만듭니다 AddCookie .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. AuthenticationScheme Cookie authenticationdefaults로 설정 합니다. authenticationdefaults 은 Cookie 스키마에 대해 "s" 값을 제공 합니다.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 (" Cookie s")를 사용 합니다.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 Policy Middleware

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

CookiePolicyOptions정책 미들웨어에 제공 된를 사용 Cookie 하 여 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.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 및 다른 크로스-원본 인증 스키마를 중단 하지만 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.SameSite CookieAuthenticationOptions 아래 행렬에 따라 설정의 설정에 영향을 줄 수 있습니다.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

인증 만들기 cookieCreate an authentication cookie

cookie보유 사용자 정보를 만들려면를 구성 ClaimsPrincipal 합니다.To create a cookie holding user information, construct a ClaimsPrincipal. 사용자 정보는 serialize 되 고에 저장 됩니다 cookie .The user information is serialized and stored in the cookie.

필요한를 사용 하 여를 만들고를 ClaimsIdentity Claim 호출 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. 여러 컴퓨터에서 호스트 되는 앱의 경우, 앱 간에 부하를 분산 하거나 웹 팜을 사용 하 여 데이터 보호를 구성 하 여 동일한 키 링 및 앱 식별자를 사용 하도록 구성 합니다.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(또는 " Cookie s")가 구성표 (예: "Contoso")로 사용 되지 않는 경우 Cookie 인증 공급자를 구성할 때 사용 되는 체계를 제공 합니다.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의 단일 원본입니다.Once a cookie is created, the cookie is the single source of identity. 백 엔드 시스템에서 사용자 계정을 사용할 수 없는 경우:If a user account is disabled in back-end systems:

  • 앱의 cookie 인증 시스템은 인증에 따라 요청을 계속 처리 합니다 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이벤트를 사용 하 여 id의 유효성 검사를 가로채 고 재정의할 수 있습니다 cookie .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 사용자 데이터베이스가 변경 되는 시기를 추적 하는 것입니다.One approach to cookie validation is based on keeping track of when the user database changes. 사용자가 발급 된 이후에 데이터베이스가 변경 되지 않은 경우에 cookie 도 해당 사용자를 다시 인증할 필요가 없습니다 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);
        }
    }
}

메서드에서 서비스를 등록 하는 동안 events 인스턴스를 등록 cookie 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. 사용자 보안 주체를 destructively 업데이트 하려면를 호출 하 context.ReplacePrincipalcontext.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.

영구 cookie sPersistent 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.

IsPersistent에서로 설정 합니다 true AuthenticationProperties .Set IsPersistent to true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

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

절대 cookie 만료Absolute cookie expiration

절대 만료 시간은를 사용 하 여 설정할 수 있습니다 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를 만들고 해당 id를 cookie 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