ASP.NET单点登录无法工作

6

在一个代码发布后,我们两个网站之间的单点登录停止工作了。这两个网站都运行在同一个域名的不同子域上。子域x被用作所有其他应用程序的登录服务器。我无法完全理解为什么会出现这种情况。在两个网站的web.config中,机器和解密密钥都是相同的。验证设置为SHA1,解密设置为AES。身份验证配置如下:

X:

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" timeout="2880" protection="All" name="Domain.ASPXAUTH" path="/" domain="domain.com" />
</authentication>

Y:

<authentication mode="Forms">
    <forms loginUrl="https://x.domain.com/Account/LogOn" timeout="2880" protection="All" name="Domain.ASPXAUTH" path="/" domain="domain.com" defaultUrl="http://x.domain.com/" />
</authentication>

SSO在今早之前一直正常运行。我不确定代码发布发生了什么变化,现在遇到了问题并且无法解决。两个应用程序当前在不同的应用程序池上运行(一个是.Net 4.0,而另一个是.Net 2.0)。当我将它们切换到使用相同的应用程序池时,SSO起作用了。但是,由于另一个站点中使用的库仅在.NET 2.0上运行,这不是一个选项。我还尝试在IIS7管理器中强制机器、解密密钥以及验证和解密算法,但没有成功。在访问x.domain.com后尝试去y.domain.com时,浏览器会被重定向回登录页面,并在事件日志中看到以下异常:
"Forms authentication failed for the request. Reason: The ticket supplied was invalid."
有什么想法吗?

你没有提到症状是什么?具体是哪里出了问题? - Mantorok
应用程序池运行在什么身份下?此外,有哪些库需要它在2.0上运行? - ScottE
3个回答

1
你是否怀疑配置也发生了变化?因为你确实需要在表单部分进行这个操作:
enableCrossAppRedirects="true"

编辑:还要确保它们使用相同的加密密钥:

<system.web>
   <machineKey validationKey="BLAHBLAHBLAHBLAH" decryptionKey="BLAHBLAHBLAH" validation="SHA1" decryption="AES"/>
</system.web>

听起来重定向工作正常,但在尝试读取票证时出现错误。


抱歉回复晚了。不幸的是,这似乎没有产生任何效果。我已将其添加到两个应用程序的web.config文件中。 - illvm
好的,那么具体是什么症状?恐怕需要更多信息。 - Mantorok
原始帖子已被编辑以显示症状。在分离的应用程序池下,框架未能接受域cookie(应该接受),导致事件日志中记录了上述异常,并且当访问http://y.domain.com时,IIS将用户重定向回https://x.domain.com/Account/LogOn。 - illvm
好的,听起来可能在解密方面出了问题。我会更新我的答案。 - Mantorok
他们正在使用相同的加密密钥、验证密钥、验证方法和解密方法。如果我将这两个应用程序设置为使用相同的应用程序池,那么一切都可以顺利进行。但是它们不能在同一个应用程序池中,因为一个应用程序需要.NET 2.0,而另一个需要.NET 4.0。我在各种网站上找到了几篇更多的论坛帖子,似乎有相同的问题,但我还没有找到解决方案。 - illvm
好的,我所有的SSO集成都使用同一个框架版本,所以也许有些问题存在。很抱歉无法提供太多帮助,祝你好运找到解决方案——如果可以的话,请在这里发布它。 - Mantorok

1
这个问题可以通过获取 Windows 和/或 .NET 的补丁/热修复来解决。具体来说:
  • KB2518870
  • KB2656351
  • KB2572078
  • KB2633870

0

我在4.0网站中将以下内容添加到web.config文件的配置标签内,使其正常工作:

  <appSettings>
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
  </appSettings>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接