Programmatically set cookie domain per user in ASP.NET MVC



我有一个ASP。NET MVC web应用程序,需要能够为每个用户设置auth cookie的域,而不是在整个web应用程序的web.config中设置它。

这是我目前设置的:

<httpCookies domain=".mydomain.com" />

场景1

当用户第一次访问该网站时,他们在www.mydomain.com上。如果他们登录到我们网站的主要部分,他们将留在www.mydomaincom上,登录将调用:

FormsAuthentication.SetAuthCookie(user.Id + "|" 
+ user.EmailAddress + "|" 
+ user.Role.ToString()
, true);

并且cookie将被正确设置,因为www.mydomain.com与.mydomain.com的cookie域匹配,一切都很好。

场景2

用户也可以注册我们网站的自己的部分,即companyname.mydomain.com。在这种情况下,如果他们从www.mydomain.com或companyname.midomain.com登录,cookie将被设置为良好,因为它与.mydomain.com.的cookie域相匹配

场景3(问题)

然而,用户可以选择将自己的域名指向我们的网站,并使其反映他们在访问companyname.mydomain.com时看到的内容。因此,假设他们注册了域名companyname.com,将其A记录指向我们的服务器,然后在我们的网站上指定他们希望将自己的url设置为companyname,它显示了我们网站中他们部分的登录页面。现在他们试图登录,当然,这不起作用,因为companyname.com与我们的cookie域.mydomain.com.不匹配

为什么我们不在web.config中完全设置httpCookies域呢?因为如果他们在www.mydomain.com上并尝试登录companyname.mydomain.com,它将失败,因为cookie将用于www.mydomain.com.

我们需要某种方式来说,嘿,这个用户的请求来自mydomain.com以外的域,请将这个用户的FormsAuthentication cookie的域设置为他们的域名,而不是.mydomain.com.

有什么想法吗??

我意识到这种方法不起作用,因为由于安全问题,您无法为不在的域设置cookie。

相反,我现在要做的是尝试登录,然后检查我们必须重定向到的域是否是我们当前所在的域。如果是,则我们设置身份验证票证并重定向到安全部分。如果我们不在重定向到的域上,我们会从currentdomain.com/validatelogin重定向到newdomain.com/validationlogin,然后会运行相同的检查,是的,我们在重定向到域上,所以设置auth cookie,然后关闭。

使用GetAuthCookie,您可以检索auth cookie并手动设置域名:

HttpCookie authcookie = FormsAuthentication.GetAuthCookie(userName, False);
authcookie.Domain = "companyname.mydomain.com";
HttpResponse.AppendCookie(authcookie);

最新更新