ASP.NET MVC - 跨子域身份验证/成员身份

时间:2009-07-25 08:08:25

标签: c# asp.net-mvc authentication asp.net-membership subdomain

在实施sub domain based language switcher时遇到障碍(en.domain.com加载英文,jp.domain.com加载日文)。

如何让单个成员资格系统跨多个子域工作(ASP.NET MVC C#)?

看到有关在web.config中添加domain="domain.com"<forms >条目的内容。这样做了,但在本地Visual Studio开发Web服务器上进行测试时是否有效?

3 个答案:

答案 0 :(得分:7)

尝试自己创建Cookie。

AccountController 中,你会发现:

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

“创建并添加到cookie集合”。它不允许修改域(但奇怪地允许修改路径)。而是在不添加到集合的情况下创建cookie,修改必要的属性,然后添加到集合中:

var a = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie);
//if you're debugging right here, a.Domain should be en.example.com; change it
a.Domain = "example.com";
HttpContext.Current.Response.Cookies.Add(a);

詹姆斯

答案 1 :(得分:3)

你必须使用点前缀,就像这样。

<authentication mode="Forms">
    <forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" />
</authentication>

答案 2 :(得分:0)

您的问题是浏览器在请求期间发送Cookie的方式。

Cookie通常绑定到单个域,这是出于安全原因和性能。例如,用户不希望将域名的cookie发送到任何其他域,因为您的cookie可能包含敏感信息。

浏览器会区分使用en.domain.com和jp.domain.com设置的Cookie。他们不允许来自一个域的cookie转到另一个域,因为它们不在父域中。

解决问题的方法是接管生成cookie的控制权。我没有玩过ASP.NET MVC,但我确信它不是通过HTML而是通过属性或其他东西来完成的。这是一种非常常见的情况。您应该为生产箱将cookie域设置为“domain.com”,这是正确的。如果您正在使用本地方框,则应将cookie域设置为“”。