将FormsAuthentication cookie传递给WCF服务

我有一个与远程WCF Web服务交谈的网站。 两者都使用相同的自定义FormsAuthentication提供程序。 我想通过WCF服务来模拟当前login网站的用户进行身份validation。 我已经做了手动,使用UserName客户端凭据,但我需要知道用户密码。 那么,什么这么放屁是这样的:一个经过身份validation的用户发出请求,我创build一个服务客户端并设置他的凭据:

serviceClient.ClientCredentials.UserName.UserName = username; serviceClient.ClientCredentials.UserName.Password = password; 

但我真正想要的是直接传递FormsAuthentication cookie,因为我不想存储用户密码。

有任何想法吗?

这听起来像你正在寻找Windows通信基础authentication服务 。

编辑:

在仔细地重读这个问题之后(在Ariel的评论之后),我想回顾一下上面的build议。 WCF身份validation服务不会增加太多这种情况下。

我没有做这之间的WCF和ASP.NET,但是我已经configuration了ASP.NET应用程序来共享表单authentication的用户,也许我可以在某种程度上帮助。

为了确保这两个应用程序都可以用相同的方式encryption/解密表单身份validationcookie,您应该为两个应用程序configuration<machineKey>元素 (在web.config或machine.config中,具体取决于是否要在机器或应用程序中执行此操作水平)。 你应该看看validationvalidationKeydecryptiondecryptionKey属性。

确保两个web.config文件中的<forms>元素的configuration类似。 具体是namepathdomain属性。

这很可能仅适用于传递给Web浏览器的cookie(但在这种情况下可能有用):为了允许cookie在http://www.foo.combar.foo.com网站之间传递,您可以configurationforms元素如下所示,以允许在一个站点上设置cookie并成功传递给另一个站点:

 <forms ... domain=".foo.com" ... /> 

传递cookie到WCF服务可能是棘手的一点。 我对WCF并不是很有经验,所以我调整了kennyw.com的代码 :

 HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>"); using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) { OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; serviceClient.MethodName(); } 

如果您在IIS中托pipeWCF(而不是自托pipe),则可以通过设置来通过ASP.NET处理pipe道传递WCF请求

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

如果您是自主托pipe,则可以使用OperationContext.Current.IncomingMessageProperties的传入消息的属性检查请求标头,并获取表单身份validationCookie值,并使用FormsAuthentication.Decrypt(string)对其进行解密。

我不知道这是否有效,但愿意听到它!

如果您在经过身份validation的IIS站点中托pipeWCF服务,那么做起来很简单。

通过将以下内容添加到web.config中的system.ServiceModel部分来启用兼容性

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

然后用以下的方式来装饰你想接受cookie的服务

 [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

现在,HttpContext.Current.User.Identity对象将被正确填充,您还可以使用PrinciplePermission要求来限制按angular色或特定用户的访问。