0

我正在尝试在主 IIS 7 站点 (local.mysite.com) 和它下面的 VirtualDirectory (local.mysite.com/vdir) 之间实现 SSO。

我已将两个 web.configs 设置为使用相同的 MachineKey 设置和身份验证部分:

<authentication mode="Forms">
  <forms name="myCookie" loginUrl="login.aspx" protection="All" path="/" enableCrossAppRedirects="true" domain=".mysite.com"/>
</authentication>
<machineKey validationKey="123" decryptionKey="456" validation="SHA1" decryption="AES"/>

我目前在主站点上有登录工作。我正在使用类似于以下的代码创建自己的身份验证 cookie:

var ticket = new FormsAuthenticationTicket(1, state.Email, DateTime.Now, expiresDate, true, state.ToString());
string encryptedTicket = FormsAuthentication.Encrypt(ticket);

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Domain = FormsAuthentication.CookieDomain };
response.Cookies.Add(cookie);

但是,每当我在登录后点击虚拟目录时,用户都没有经过身份验证。使用 FireBug 我可以看到 cookie 是在请求​​中发送的,但我无法在后面的代码中访问它。但是,如果我从 VirtualDirectories web.config 中删除该条目,我可以在 Requests cookie 集合中看到“myCookie”cookie。

我不知道为什么会这样,有人可以解释一下吗?我对在 IIS 中使用 VirtualDirectories 不太熟悉,所以可能是我缺少的东西。

4

2 回答 2

0

问题归结为 web.config 设置。我为 FormsAuthenticationModule OnAuthenticate 模块添加了一个处理程序,我得到的错误是“在加密操作期间发生错误”。

这是由于 VirtualDirectory 具有<httpRuntime targetFramework="4.5">但未在父应用程序中设置。设置这个解决了这个问题。

于 2013-11-08T16:36:15.367 回答
0

处理此问题的最佳方法是使机器密钥解密回退到 Framework20SP2

从这篇文章:http: //msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode.aspx

只需将该属性添加到您的 .net 4.5 应用程序中的 machinekey

<machineKey validationKey="" decryptionKey="" validation="SHA1" compatibilityMode="Framework20SP2" />

您现在不需要从 httpruntime 中删除 targetFramework="4.5" 。

于 2014-01-13T09:57:27.323 回答