我有一个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。
任何想法??
答案 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);