2012-07-27 147 views
0

我有一个asp.net 4.0应用程序(客户端),使ajax/json调用一个http facade,然后将调用传递给我们的wcf服务层。表单身份验证Cookie和WCF

用户必须使用表单身份验证在客户端进行身份验证。然后这个想法就是认证cookie将被传递给http外观并且可以被访问。 [基于Dino Esposito的书 - Microsoft ASP.NET和AJAX:架构Web应用程序]的设计

问题是,在外观上,HttpContext.Current.User.Identity.Name是一个空字符串,而IsAuthenticated是false。

我已经通过添加以下到我的system.ServiceModel节在我的web.config(HTTP门面级别)启用兼容性:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

我已经装饰了我的服务有以下:

[AspNetCompatibilityRequirements(RequirementsMode = 
AspNetCompatibilityRequirementsMode.Required)] 

当我在ajax/facade应用程序中调试时,我可以看到cookie存在于HttpContext.Current.Request.Cookies中。看起来Anonymous正在使用,而不是我的身份验证用户。

这两个应用程序都运行在同一个IIS服务器上。

通过serviceProxy.js调用启用了AJAX的wcf服务。也许这种方法没有传递必要的cookie?

WCF跟踪当前显示'..ASPXANONYMOUS = .....; ASP.NET_SessionId = ....; .ASPXAUTH = .....'在消息日志中。

我感觉我错过了一些简单的东西,但我太接近问题了。

欢迎任何建议。

回答

1

我不确定我完全理解了您要完成的内容,但是如果这些是两个单独的应用程序,您将需要共享机器密钥以解密/加密两者中的auth cookie。

在你的web.config,请确保您有以下设置:

<machineKey 
    validationKey="[generated key]" 
    validation="HMACSHA512" 
    decryptionKey="[generated key]" 
    decryption="AES" 
    /> 

看到如何生成这个CodeProject上的文章对这些键(以及关于它们的详细信息):

ASP.Net machineKey Generator - CodeProject

让我知道这是否有帮助...

+0

谢谢利兰。我欠你一杯啤酒什么的。我假设每台机器上都有一台机器密钥,并且每个应用程序都没有什么不同。他们是两个分开的应用程序。蒂姆,没问题, – 2012-07-27 06:19:05

+0

。很高兴帮助。通常它们只是自动生成的 - 即使对于单个应用程序也可能会导致麻烦,因为如果重新部署(即使在同一台计算机上),Cookie也不匹配。当他们的“记住我”复选框不起作用时,最终可能会导致用户生气... – 2012-07-27 15:16:25