mirror of https://github.com/abpframework/abp.git
committed by
GitHub
1 changed files with 85 additions and 0 deletions
@ -0,0 +1,85 @@ |
|||||
|
# How to share the cookies between subdomains |
||||
|
|
||||
|
## Introduction |
||||
|
|
||||
|
Sharing cookies between subdomains is a common requirement in web development. For example, you have a website with multiple subdomains, and you want to share the login status between these subdomains. Once a user logs in to one subdomain, the user should be logged in to all subdomains. |
||||
|
|
||||
|
This article will show you how to achieve this in an ASP.NET Core application. |
||||
|
|
||||
|
## Implementation principle |
||||
|
|
||||
|
The `cookie` has a `Domain` attribute which specifies which server can receive a cookie. |
||||
|
If specified, then cookies are available on the server and its subdomains. For example, if you set `Domain=.abp.io`, cookies are available on `abp.io` and its subdomains like `community.abp.io`. |
||||
|
|
||||
|
If the server does not specify a **Domain**, the cookies are available on the server but not on its subdomains. Therefore, specifying the **Domain** is less restrictive than omitting it. However, it can be helpful when subdomains need to share information about a user. |
||||
|
|
||||
|
## Change the domain of the cookie in ASP.NET Core |
||||
|
|
||||
|
There is a `CookiePolicyMiddleware` in ASP.NET Core, you can add some policies to the `CookiePolicyOptions` during cookies are appended or deleted. |
||||
|
|
||||
|
We will add a policy to the `CookiePolicyOptions` to change the `domain` of the cookie: |
||||
|
|
||||
|
```csharp |
||||
|
services.Configure<CookiePolicyOptions>(options => |
||||
|
{ |
||||
|
options.OnAppendCookie = cookieContext => |
||||
|
{ |
||||
|
ChangeCookieDomain(cookieContext, null); |
||||
|
}; |
||||
|
|
||||
|
options.OnDeleteCookie = cookieContext => |
||||
|
{ |
||||
|
ChangeCookieDomain(null, cookieContext); |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
private static void ChangeCookieDomain(AppendCookieContext appendCookieContext, DeleteCookieContext deleteCookieContext) |
||||
|
{ |
||||
|
if (appendCookieContext != null) |
||||
|
{ |
||||
|
// Change the domain of all cookies |
||||
|
//appendCookieContext.CookieOptions.Domain = ".abp.io"; |
||||
|
|
||||
|
// Change the domain of the specific cookie |
||||
|
if (appendCookieContext.CookieName == ".AspNetCore.Culture") |
||||
|
{ |
||||
|
appendCookieContext.CookieOptions.Domain = ".abp.io"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (deleteCookieContext != null) |
||||
|
{ |
||||
|
// Change the domain of all cookies |
||||
|
//appendCookieContext.CookieOptions.Domain = ".abp.io"; |
||||
|
|
||||
|
// Change the domain of the specific cookie |
||||
|
if (deleteCookieContext.CookieName == ".AspNetCore.Culture") |
||||
|
{ |
||||
|
deleteCookieContext.CookieOptions.Domain = ".abp.io"; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Add the `app.UseCookiePolicy()` in the ASP.NET Core pipeline: |
||||
|
|
||||
|
```csharp |
||||
|
//... |
||||
|
app.UseStaticFiles(); |
||||
|
app.UseCookiePolicy(); |
||||
|
//... |
||||
|
``` |
||||
|
|
||||
|
If you check the HTTP response headers, you will see the `Set-Cookie` header with the `domain` attribute as follows: |
||||
|
|
||||
|
```http |
||||
|
Set-Cookie: .AspNetCore.Culture=c%3Den%7Cuic%3Den; expires=Mon, 09 Mar 2026 02:00:00 GMT; domain=.abp.io; path=/ |
||||
|
``` |
||||
|
|
||||
|
The subdomains can share the `.AspNetCore.Culture` cookie now. |
||||
|
|
||||
|
In another community article, we use the same middleware to [fix the Chrome login issue for the IdentityServer4](https://community.abp.io/posts/patch-for-chrome-login-issue-identityserver4-samesite-cookie-problem-weypwp3n) |
||||
|
|
||||
|
## Summary |
||||
|
|
||||
|
The `CookiePolicy` middleware provides a way to control cookies in an ASP.NET Core, It is very useful if you have more complex requirements for Cookies. |
||||
Loading…
Reference in new issue