我有两个应用程序。第一个是需要身份验证的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实例上运行。
最佳答案
所有奇怪的行为是由于每个应用程序之间的httpRuntime不同。我的MVC应用程序设置为4.5,而我设置cookie的应用程序为4.0。显然,加密方式在幕后发生了变化,因此,当cookie通过管道进入时,由于ASP.NET无法解密它,它将被剥离。
当我手动尝试通过将name属性设置为不同来解密cookie时,我遇到了这个问题。这样,我可以访问cookie并尝试进行tytyty,但是到那时,我会得到一个异常(exception)。
我发现以下链接将我引向正确的方向:Sharing a cookie between two websites on the same domain
通过在机器 key 上设置兼容模式设置,cookie可以很好地通过并且可以被解密。