在ASP.NET MVC中以编程方式为每个用户设置cookie域

时间:2012-09-29 16:51:40

标签: asp.net asp.net-mvc cookies

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

以下是我目前的设定:

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

情景1

当用户首次访问该网站时,他们会访问www.mydomain.com。如果他们登录我们网站的主要部分,他们将留在www.mydomain.com,登录将致电:

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.mydomain.com登录,cookie将被设置正常,同样,它匹配.mydomain.com的cookie域。

场景3(问题)

但是,用户可以选择将自己的域名指向我们的网站,并将其视为他们在访问companyname.mydomain.com时所看到的内容。因此,假设他们注册域名companyname.com,将其A记录指向我们的服务器,然后在我们的网站上指定他们想要将他们的网址设为companyname.com而不是companyname.mydomain.com。他们转到companyname.com,它显示了我们网站部分的登录页面。现在他们尝试登录,当然,它不起作用,因为companyname.com与.mydomain.com的cookie域不匹配。

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

我们需要一些方式来说,嘿,此用户的请求来自mydomain.com以外的域,请将此用户的FormsAuthentication cookie的域设置为其域名而不是.mydomain.com。

任何想法??

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

使用GetAuthCookie,您可以检索身份验证Cookie并手动设置域名:

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