我有两个申请。第一个是需要身份验证的ASP.NET 4 MVC应用程序。第二个是一个应用程序,它将处理身份验证并设置表单身份验证cookie。
在授权应用上,我致电
FormsAuthentication.SetAuthCookie(username, false);
然后我做一个简单的Response.Redirect回到我的MVC应用程序。
在MVC应用程序中,我正在制作一个继承自AuthorizeFilter的自定义过滤器。在OnAuthorization方法上,我打算解密cookie并从授权用户那里获取一些额外的用户数据。
我的问题是,
HttpContext.Current.Request.Cookies
没有任何内容。我已经检查了fiddler,并且身份验证应用程序正确设置了cookie,并且MVC应用程序获取了cookie,但是当它到达我的过滤器时,那里什么都没有。
我的web.config在两个应用程序中具有完全相同的设置:
<forms
name=".ASPXFORMSAUTH"
protection="All"
path="/"
timeout="30"
enableCrossAppRedirects="true"
domain="localhost"/>
我已使用相同的machineKey设置两者以便能够解密cookie。问题是,我在我的MVC过滤器中的OnAuthorization方法中没有看到任何cookie。
现在两个应用程序都在我的本地IIS实例上运行。
答案 0 :(得分:8)
所有奇怪的行为都是由于每个应用程序之间的httpRuntime不同。我的MVC应用程序设置为4.5,而我设置cookie的应用程序是4.0。显然,加密在幕后发生了变化,因此当cookie通过管道时,它会因为ASP.NET无法解密而被剥离。
当我手动尝试通过将name属性设置为不同来解密cookie时,我遇到了这个问题。这样我可以访问cookie并尝试dectypt,但在那时我会得到一个例外。
我发现以下链接让我朝着正确的方向前进:Sharing a cookie between two websites on the same domain
通过在机器密钥上设置兼容模式设置,cookie可以很好地解密。