将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中,具体取决于是否要在机器或应用程序中执行此操作水平)。 你应该看看validation
, validationKey
, decryption
和decryptionKey
属性。
确保两个web.config文件中的<forms>
元素的configuration类似。 具体是name
, path
和domain
属性。
这很可能仅适用于传递给Web浏览器的cookie(但在这种情况下可能有用):为了允许cookie在http://www.foo.com和bar.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色或特定用户的访问。