将经过身份验证的用户发送到WCF应用

时间:2009-10-20 20:23:14

标签: c# asp.net wcf security interop

我有2个申请;一个是ASP.NET 3.5 Ajax应用程序(客户端),另一个是WCF Web应用程序(BackEnd)。

应用程序部署在IIS 7上的单独Windows Server 2008中。后端应用程序启用了net.tcp和http绑定;某些服务在netTcpBinding下公开,其他服务在basicHttpBinding下公开;绑定没有配置任何安全性。

客户端应用程序使用FormsAuthentication对用户进行身份验证。 netTcpBinding下的所有服务都在客户端应用程序中使用。在后端,我需要知道哪个用户调用服务来进行一些审计任务。这可能吗?

1 个答案:

答案 0 :(得分:5)

如果您实际上并不希望通过后端服务实现安全性,并且只是希望能够审核用户身份(意味着您实际上是在向谁发送身份信息的信任),您可以考虑通过身份信息传递每个请求的自定义标头。

为此,您可以创建一个自定义IClientMessageInspector,通过在其BeforeSendRequest实现中通过类似HttpContext.Current.User.Name的内容从当前ASP.NET上下文中提取信息来添加标头。要将IClientMessageInspector附加到客户端代理,您只需创建一个IEndpointBehavior,然后通过config将其添加到端点(检查the documentation for IClientMessageInspector以获取示例代码)。

以下是您的BeginSendRequest实现可能的样子:

public void BeginSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
{
   string currentContextUserName = HttpContext.Current.User.Identity.Name;

   MessageHeader userNameHeader = MessageHeader.CreateHeader("Username", "urn:my-custom-namespace", currentContextUserName);

   request.Headers.Add(userNameHeader);
}

在服务器端,您可以通过实施IDispatchMessageInspector并在那里进行审核来考虑通用审核。或者您可以在可能希望通过OperationContext::IncomingMessageHeaders属性使用它的方法中“手动”检索标题。