ASP.NET身份2 - 登录foo.com并在username.foo.com上注销时注销不起作用

时间:2018-04-06 07:08:50

标签: c# asp.net asp.net-mvc cookies asp.net-identity

我正在开发一个多租户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实现,但它有类似的问题。

请帮忙。

1 个答案:

答案 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}}。