我正在开发一个多租户Web应用程序,主要使用.NET Framework 4.6(MVC和ASP.NET Identity 2.0)。这是我的实施:
用户访问foo.com进行登录。我在foo.com Startup.Auth.cs中使用以下代码:
var cookieOptions = new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/account/login"),
CookieDomain = ".foo.com"
};
app.UseCookieAuthentication(cookieOptions);
两个应用程序上的机器密钥完全相同(foo.com以及username.foo.com),这是我的示例机器密钥:
<machineKey validationKey="xx" decryptionKey="xx" validation="SHA1" decryption="AES" />
要登录我正在使用以下代码:
signInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
我的其他应用程序username.abc.com是多租户,即用户名可以是任何内容。我在username.abc.com中使用以下代码Startup.Auth.cs:
var cookieOptions = new CookieAuthenticationOptions
{
ReturnUrlParameter = "redirectto",
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/account/login")
};
app.UseCookieAuthentication(cookieOptions);
注意,我没有使用cookies域名,因为它可以是任何东西,或者用户已经开始使用他自己的域名(让我们考虑用户仍在使用foo.com子域名。)
使用此代码,用户成功登录并在他的username.foo.com上重定向,但只要他点击username.foo.com上的注销,页面就会重新加载并且没有任何反应。这是我在注销操作中使用的内容:
authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
//authenticationManager.SignOut();
我们还有另一个选项可以从username.foo.com登录和注销,所以当用户直接从username.foo.com登录时,他可以成功注销。仅在用户从foo.com登录时才会出现问题。
从基础架构角度来看,foo.com不是负载均衡的,但是username.foo.com正在通过负载均衡器运行(在生产中)。但我不认为这会有问题,因为我在同一个问题的单一登台环境中运行这两个应用程序。
我也尝试过自定义CookieAuthenticationProvider实现,但它有类似的问题。
请帮忙。
答案 0 :(得分:3)
您无法从.foo.com
更改username.foo.com
的Cookie。它位于RFC2109。
4.3.2拒绝Cookies
- 来自请求主机y.x.foo.com的Set-Cookie,用于Domain = .foo.com 会被拒绝,因为H是y.x并且包含一个点。
您必须更改工作流程。您可以使用foo.com
将用户重定向到redirect_url
以便注销,并在注销成功后将其重定向到位于redirect_url
的{{1}}。