Heat oven to 350°F. Cut logs into 1/4-inch slices. Place 2 inches apart onto ungreased cookie sheets. Bake 10-14 minutes or until edges are lightly browned. Thus if an attacker steals a user’s cookie, they can use that cookie to login as that user even if the user logs out. Cookies will only be detected as ‘stale’ if they are older than your SESSIONCOOKIEAGE. Finally, the size of a cookie can have an impact on the speed of your site.
How to modify the recipe: Increase flour up to 3-1/2 cups. Result: Dense, doughlike cookies; Adding more flour to chocolate chip cookie dough will create a stiffer dough that spreads less in the oven. These cookies tend to be a bit denser but end up chewy in the middle—almost to the point of being underdone. See full list on github.com.
-->By Rick Anderson
ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. However, a cookie-based authentication provider without ASP.NET Core Identity can be used. For more information, see Introduction to Identity on ASP.NET Core.
View or download sample code (how to download)
For demonstration purposes in the sample app, the user account for the hypothetical user, Maria Rodriguez, is hardcoded into the app. Use the Email address maria.rodriguez@contoso.com
and any password to sign in the user. 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.
In the Startup.ConfigureServices
method, create the Authentication Middleware services with the AddAuthentication and AddCookie methods:
AuthenticationScheme passed to AddAuthentication
sets the default authentication scheme for the app. AuthenticationScheme
is useful when there are multiple instances of cookie authentication and you want to authorize with a specific scheme. 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. When a cookie authentication scheme isn't provided to AddCookie, it uses CookieAuthenticationDefaults.AuthenticationScheme
('Cookies').
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. For more information, see General Data Protection Regulation (GDPR) support in ASP.NET Core.
In Startup.Configure
, call UseAuthentication
and UseAuthorization
to set the HttpContext.User
property and run Authorization Middleware for requests. Call the UseAuthentication
and UseAuthorization
methods before calling UseEndpoints
:
The CookieAuthenticationOptions class is used to configure the authentication provider options.
Set CookieAuthenticationOptions
in the service configuration for authentication in the Startup.ConfigureServices
method:
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.
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.
The default MinimumSameSitePolicy value is SameSiteMode.Lax
to permit OAuth2 authentication. To strictly enforce a same-site policy of SameSiteMode.Strict
, set the MinimumSameSitePolicy
. 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.
The Cookie Policy Middleware setting for MinimumSameSitePolicy
can affect the setting of Cookie.SameSite
in CookieAuthenticationOptions
settings according to the matrix below.
MinimumSameSitePolicy | Cookie.SameSite | Resultant Cookie.SameSite setting |
---|---|---|
SameSiteMode.None | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict |
SameSiteMode.Lax | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict | SameSiteMode.Lax SameSiteMode.Lax SameSiteMode.Strict |
SameSiteMode.Strict | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict | SameSiteMode.Strict SameSiteMode.Strict SameSiteMode.Strict |
To create a cookie holding user information, construct a ClaimsPrincipal. The user information is serialized and stored in the cookie.
Create a ClaimsIdentity with any required Claims and call SignInAsync to sign in the user:
If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.
SignInAsync
creates an encrypted cookie and adds it to the current response. If AuthenticationScheme
isn't specified, the default scheme is used.
RedirectUri is only used on a few specific paths by default, for example, the login path and logout paths. For more information see the CookieAuthenticationHandler source.
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.
To sign out the current user and delete their cookie, call SignOutAsync:
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.
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.
Once a cookie is created, the cookie is the single source of identity. If a user account is disabled in back-end systems:
The ValidatePrincipal event can be used to intercept and override validation of the cookie identity. Validating the cookie on every request mitigates the risk of revoked users accessing the app.
One approach to cookie validation is based on keeping track of when the user database changes. 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. In the sample app, the database is implemented in IUserRepository
and stores a LastChanged
value. When a user is updated in the database, the LastChanged
value is set to the current time.
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:
To implement an override for the ValidatePrincipal
event, write a method with the following signature in a class that derives from CookieAuthenticationEvents:
The following is an example implementation of CookieAuthenticationEvents
:
Register the events instance during cookie service registration in the Startup.ConfigureServices
method. Provide a scoped service registration for your CustomCookieAuthenticationEvents
class:
Consider a situation in which the user's name is updated—a decision that doesn't affect security in any way. If you want to non-destructively update the user principal, call context.ReplacePrincipal
and set the context.ShouldRenew
property to true
.
Warning
The approach described here is triggered on every request. Validating authentication cookies for all users on every request can result in a large performance penalty for the app.
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.
The following code snippet creates an identity and corresponding cookie that survives through browser closures. 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.
Set IsPersistent to true
in AuthenticationProperties:
An absolute expiration time can be set with ExpiresUtc. To create a persistent cookie, IsPersistent
must also be set. Otherwise, the cookie is created with a session-based lifetime and could expire either before or after the authentication ticket that it holds. When ExpiresUtc
is set, it overrides the value of the ExpireTimeSpan option of CookieAuthenticationOptions, if set.
The following code snippet creates an identity and corresponding cookie that lasts for 20 minutes. This ignores any sliding expiration settings previously configured.
ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. However, a cookie-based authentication provider without ASP.NET Core Identity can be used. For more information, see Introduction to Identity on ASP.NET Core.
View or download sample code (how to download)
For demonstration purposes in the sample app, the user account for the hypothetical user, Maria Rodriguez, is hardcoded into the app. Use the Email address maria.rodriguez@contoso.com
and any password to sign in the user. 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.
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.
In the Startup.ConfigureServices
method, create the Authentication Middleware service with the AddAuthentication and AddCookie methods:
AuthenticationScheme passed to AddAuthentication
sets the default authentication scheme for the app. AuthenticationScheme
is useful when there are multiple instances of cookie authentication and you want to authorize with a specific scheme. 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. When a cookie authentication scheme isn't provided to AddCookie, it uses CookieAuthenticationDefaults.AuthenticationScheme
('Cookies').
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. For more information, see General Data Protection Regulation (GDPR) support in ASP.NET Core.
In the Startup.Configure
method, call the UseAuthentication
method to invoke the Authentication Middleware that sets the HttpContext.User
property. Call the UseAuthentication
method before calling UseMvcWithDefaultRoute
or UseMvc
:
The CookieAuthenticationOptions class is used to configure the authentication provider options.
Set CookieAuthenticationOptions
in the service configuration for authentication in the Startup.ConfigureServices
method:
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.
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.
The default MinimumSameSitePolicy value is SameSiteMode.Lax
to permit OAuth2 authentication. To strictly enforce a same-site policy of SameSiteMode.Strict
, set the MinimumSameSitePolicy
. 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.
The Cookie Policy Middleware setting for MinimumSameSitePolicy
can affect the setting of Cookie.SameSite
in CookieAuthenticationOptions
settings according to the matrix below.
MinimumSameSitePolicy | Cookie.SameSite | Resultant Cookie.SameSite setting |
---|---|---|
SameSiteMode.None | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict |
SameSiteMode.Lax | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict | SameSiteMode.Lax SameSiteMode.Lax SameSiteMode.Strict |
SameSiteMode.Strict | SameSiteMode.None SameSiteMode.Lax SameSiteMode.Strict | SameSiteMode.Strict SameSiteMode.Strict SameSiteMode.Strict |
To create a cookie holding user information, construct a ClaimsPrincipal. The user information is serialized and stored in the cookie.
Create a ClaimsIdentity with any required Claims and call SignInAsync to sign in the user:
SignInAsync
creates an encrypted cookie and adds it to the current response. If AuthenticationScheme
isn't specified, the default scheme is used.
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.
To sign out the current user and delete their cookie, call SignOutAsync:
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.
Once a cookie is created, the cookie is the single source of identity. If a user account is disabled in back-end systems:
The ValidatePrincipal event can be used to intercept and override validation of the cookie identity. Validating the cookie on every request mitigates the risk of revoked users accessing the app.
One approach to cookie validation is based on keeping track of when the user database changes. 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. In the sample app, the database is implemented in IUserRepository
and stores a LastChanged
value. When a user is updated in the database, the LastChanged
value is set to the current time.
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:
To implement an override for the ValidatePrincipal
event, write a method with the following signature in a class that derives from CookieAuthenticationEvents:
The following is an example implementation of CookieAuthenticationEvents
:
Register the events instance during cookie service registration in the Startup.ConfigureServices
method. Provide a scoped service registration for your CustomCookieAuthenticationEvents
class:
Consider a situation in which the user's name is updated—a decision that doesn't affect security in any way. If you want to non-destructively update the user principal, call context.ReplacePrincipal
and set the context.ShouldRenew
property to true
.
Warning
The approach described here is triggered on every request. Validating authentication cookies for all users on every request can result in a large performance penalty for the app.
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.
The following code snippet creates an identity and corresponding cookie that survives through browser closures. 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.
Set IsPersistent to true
in AuthenticationProperties:
An absolute expiration time can be set with ExpiresUtc. To create a persistent cookie, IsPersistent
must also be set. Otherwise, the cookie is created with a session-based lifetime and could expire either before or after the authentication ticket that it holds. When ExpiresUtc
is set, it overrides the value of the ExpireTimeSpan option of CookieAuthenticationOptions, if set.
The following code snippet creates an identity and corresponding cookie that lasts for 20 minutes. This ignores any sliding expiration settings previously configured.