AuthTicket未在虚拟目录中被选中

时间:2013-11-08 15:38:30

标签: .net iis-7 forms-authentication

我正在尝试在主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,所以可能是我缺少的东西。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

处理此问题的最佳方法是使machinekey解密回退到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”。