【问题标题】:ASP .NET Cross Site Forms Authentication works in Dev but not productionASP .NET 跨站点表单身份验证适用于开发但不适用于生产
【发布时间】:2011-08-15 18:39:03
【问题描述】:

我有两个 MVC3 站点,它们都托管在我配置为使用相同身份验证 cookie 的同一台服务器上。

第一个站点是使用 Windows 身份验证的 Intranet 站点。该站点有一个简单的操作,用于检查用户是否已通过身份验证,如果用户已通过身份验证,它会创建一个 FormsAuthentication cookie,并将其添加到响应中。此 cookie 是为我从用户的 AD 组中确定的一般用户创建的。然后响应将用户重定向到使用表单身份验证的第二个站点。

当我在本地机器上运行它时,一切都如前所述。当我将它部署到我们的本地 Web 服务器时,它没有。我已经测试了用户的组是否被正确确定,它是否为 cookie 创建了一个有效的用户,并且我已经验证这在 web 服务器上是正确的。

我是这样做的:

首先,我让两个站点使用相同的机器密钥进行加密和解密。

当我在 Site1 中创建 cookie 时,我确保它与在 Site2 上创建的 cookie 具有相同的名称和域。

     var cookie = FormsAuthentication.GetAuthCookie(userName, false);
     cookie.Domain = FormsAuthentication.CookieDomain; //This is the Domain of my 2nd site as they are different

     HttpContext.Response.Cookies.Add(cookie); //Add my cookie to the response
     HttpContext.Response.RedirectPermanent(urlForSite2);

同样,当我在本地计算机上运行它时,它可以正常工作。但是在部署时,它要么没有在请求中传递 cookie,要么响应忽略了它,但我不确定如何验证这两种情况。

如有任何问题,请随时询问有关我如何执行此操作的更多详细信息,如果这有助于获得我需要的答案。

【问题讨论】:

    标签: asp.net-mvc-3 cookies forms-authentication


    【解决方案1】:

    不允许跨域 cookie。如果您有两个单独的域;一个人无法访问其他人的 cookie。使用相同的机器密钥时,两个单独的虚拟目录/应用程序将起作用。 http://blogs.technet.com/b/sandy9182/archive/2007/05/07/sharing-forms-cookie-between-asp-net-web-application.aspx

    如果您想在子域之间共享登录 cookie,您需要将登录 cookie 的域属性编辑为二级域“abc.com”,以便“www.abc.com”和“ww2.abc”。 com" 将有权访问 cookie。 http://forums.asp.net/t/1533660.aspx

    String usrName = User.Identity.Name.ToString();
    HttpCookie authCookie = Security.FormsAuthentication.GetAuthCookie(usrName, false);
    authCookie.Domain = "abc.com";
    Response.AppendCookie(authCookie);
    

    【讨论】:

    • 强制在同一台服务器机器上?什么时候在同一台机器上工作,在不同的服务器上,不工作。我确定 machineKey 是一样的。
    • @JulianoOliveira - Forms Auth 在服务器场(单独的机器)上工作,您需要验证 machine.config 的 machineKey 标签的所有属性是否相同(validationKey、decryptionKey、validation 和 decryption )。如果服务器代表不同的子域,您必须在调用 FormsAuthentication.SetAuthCookie 后使用我的回答中的代码。
    【解决方案2】:

    其实是可以的,但是没有域/子域cookie共享那么简单。

    http://www.codeproject.com/KB/aspnet/CrossDomainSSOModel.aspx

    虽然本文中给出的示例并不直接适用于我正在做的事情,但我可以使用其中表达的一些想法来获得我需要的工作。它最终成为我在 site2 web.config 中的配置设置。

    我的网址如下

    站点 1 需要一个主机条目,将其寻址到主机的特定 IP 地址。它也是我的 IE 安全设​​置 - 本地 Intranet 站点中的一个条目。

    我应该注意到,这些应用程序都是在同一个默认网站下运行的虚拟目录。

    我以为我已经解决了我的问题,但是将配置文件中的域设置为空字符串,但这不起作用。我不确定现在可以做什么。当我在本地机器上运行它时,这仍然有效,但在我的服务器上运行它时无效。唯一的区别是网址。

    我的开发机器正在使用这些网址

    我希望这会增加一些说明。这个答案确实应该作为对我的问题的编辑发布,但是当我最初发布它时,我认为它已经工作了。

    更新:我认为我的答案在我上面的网址中。我的开发机器 URL 都使用相同的域名,在本例中为 localhost。我想如果我改变我部署的网站以使用相同的域,我会没事的。等我搞定了,我会发布更新。

    【讨论】:

    • 我现在发现,在我的本地 IIS 服务器上,使用上面提到的开发机器 URL,我必须将我的 web.config 的表单设置中的 Domain 属性保留为空字符串,否则它会赢不在那里工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多