Ari*_*sky 11 asp.net wcf forms-authentication wcf-security
我有一个与远程WCF Web服务对话的网站.两者都使用相同的自定义FormsAuthentication Provider.我想通过模拟当前登录站点的用户的WCF服务进行身份验证.我已经使用UserName客户端凭据手动执行此操作,但我需要知道用户密码.那么,最有效的是:经过身份验证的用户发出请求,我创建了一个服务客户端并设置了他的凭据:
serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;
Run Code Online (Sandbox Code Playgroud)
但我真正想要的是直接传递FormsAuthentication cookie,因为我不想存储用户密码.
有任何想法吗?
dar*_*iom 13
听起来您正在寻找Windows Communication Foundation身份验证服务.
编辑:
在仔细阅读了这个问题之后(在Ariel的评论之后),我想撤回上述建议.WCF身份验证服务不会对此方案添加太多内容.
我没有在WCF和ASP.NET之间做过这个,但是我已经配置了ASP.NET应用程序来共享经过身份验证的用户,也许我可以在某种程度上提供帮助.
要确保两个应用程序都能以相同的方式加密/解密表单身份验证cookie,您应该为两个应用程序配置<machineKey>元素(在web.config或machine.config中,具体取决于您是否要在计算机或应用程序级别执行此操作).你应该看看validation,validationKey,decryption和decryptionKey属性.
确保<forms>两个web.config文件中的元素配置相似.具体来说name,path和domain属性.
这可能只适用于传入/传出Web浏览器的cookie(但在这种情况下可能很有用):要允许cookie在网站www.foo.com和bar.foo.com之间传递,您可以配置forms元素如下允许在一个站点上设置cookie并成功传递给另一个站点:
<forms ... domain=".foo.com" ... />
Run Code Online (Sandbox Code Playgroud)
将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();
}
Run Code Online (Sandbox Code Playgroud)
如果您在IIS中托管WCF(而不是自托管),您可以通过设置通过ASP.NET处理管道传递WCF请求
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
如果您是自托管,则可以使用传入消息的属性检查请求标头,OperationContext.Current.IncomingMessageProperties并获取表单身份验证cookie值并使用它进行解密FormsAuthentication.Decrypt(string).
我不知道这是否会起作用,但是如果有的话我很乐意听到!