我正在尝试在主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"/>
我目前正在主站点登录。我正在使用类似于:
的代码创建自己的身份验证cookievar 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,所以可能是我缺少的东西。
答案 0 :(得分:0)
问题归结为web.config设置。我为FormsAuthenticationModule OnAuthenticate模块添加了一个处理程序,我得到的错误是“加密操作期间发生错误”。
这是因为VirtualDirectory有<httpRuntime targetFramework="4.5">
,但未在父应用程序中设置。设置这个解决了这个问题。
答案 1 :(得分:0)
处理此问题的最佳方法是使machinekey解密回退到Framework20SP2
只需将该属性添加到.net 4.5应用程序中的machinekey
即可<machineKey validationKey="" decryptionKey="" validation="SHA1" compatibilityMode="Framework20SP2" />
您现在无需从httpruntime删除targetFramework =“4.5”。