IIS6 和 IIS7 表单身份验证兼容性
Posted
技术标签:
【中文标题】IIS6 和 IIS7 表单身份验证兼容性【英文标题】:IIS6 & IIS7 forms auth compatibility 【发布时间】:2010-11-25 11:02:54 【问题描述】:背景:
我有两个 Web 应用程序,设置在不同的 Web 服务器上,目前都是 IIS6。应用程序 1 (A1 - a1.domain.com) 使用应用程序 2 (A2 - a2.domain.com) 设置的表单身份验证 cookie。
在 A1 web.config 我有:
<authentication mode="Forms">
<forms name=".ASPXAUTH" domain="domain.com" protection="All" path="/" loginUrl="http://a2.domain.com/login.aspx" timeout="60" />
</authentication>
在 A2 web.config 我有:
<authentication mode="Forms">
<forms name=".ASPXAUTH" domain="domain.com" protection="All" path="/" loginUrl="login.aspx" timeout="60" />
</authentication>
这两个应用程序还共享 web.config 中的 machineKey 值
完美运行,没有任何问题。
问题:
我正在升级 A1 以使用 .NET 4.0 并在 IIS7 中运行,现在共享表单身份验证不起作用。我仍然被重定向到 A2 上的正确登录页面,我可以看到它设置了身份验证 cookie,但是当我返回 A1 时,身份验证失败并出现以下错误(来自事件查看器):
请求的表单身份验证失败。原因:提供的票证无效。
我试过了:
在 IIS6 中设置 A1 的升级版本(这有效 - 因此 IIS6 中不同 .NET 版本中的表单身份验证之间没有兼容性问题)
使用本地登录页面在 IIS7 中设置升级的 A1,即将登录页面从 A2 复制到 A1 并设置 A1 loginUrl="login.aspx"(也可以)
这让我猜测,在 IIS6 站点下创建的 auth cookie 用于在 IIS7 站点下验证用户身份会导致一些兼容性问题。
有人知道怎么解决吗?
【问题讨论】:
【参考方案1】:在 .NET 4.0 中,身份验证票证的加密方式发生了变化。如果您想与旧版本兼容,您可以像这样设置ticketCompatibilityMode
属性:
<forms
loginUrl="/Login.aspx"
timeout="2880"
ticketCompatibilityMode="Framework20"
domain="domain.com"
/>
【讨论】:
谢谢,但不幸的是这没有奏效。我认为我没有看到 2.0 和 4.0 之间的任何兼容性问题,因为我已经在与 A2 相同的服务器上的 IIS6 中设置了 A1(但使用不同版本的 .NET)并发现这可行。唯一不工作的情况是它跨越两台服务器,一台使用 IIS6,另一台使用 IIS7,无论 .NET 版本如何。 身份验证cookie不是由IIS创建的,而是由ASP.NET创建的。所以这可能不起作用的原因要么是因为你没有相同的机器密钥,.NET 4.0 中的ticketCompatibilityMode
,最后是微软发布的关于 ASP.NET 中的 Oracle Padding 漏洞的最新补丁:如果你有它仅安装在一台服务器上而不是另一台服务器上可能会造成问题。
在我的本地机器上安装安全补丁似乎已经成功了。阅读有关 ticketCompatibilityMode 的信息,似乎这会在 cookie 到期时间方面有所不同,所以我也会将其保留在那里。谢谢达林!以上是关于IIS6 和 IIS7 表单身份验证兼容性的主要内容,如果未能解决你的问题,请参考以下文章