1

我有一个 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 记录指向我们的服务器,然后在我们的网站上指定他们希望他们的 url 是 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。

有任何想法吗??

4

2 回答 2

4

我意识到这种方法行不通,因为由于安全隐患,您无法为您不在的域设置 cookie。

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

于 2012-09-30T22:09:59.380 回答
1

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

HttpCookie authcookie = FormsAuthentication.GetAuthCookie(userName, False);
authcookie.Domain = "companyname.mydomain.com";
HttpResponse.AppendCookie(authcookie);
于 2012-09-29T17:41:37.587 回答