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

Vic*_*orV 3 c# asp.net security wcf interop

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

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

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

Dre*_*rsh 5

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

为此,您可以创建一个自定义IClientMessageInspector,通过在其BeforeSendRequest实现中通过HttpContext.Current.User.Name之类的内容从当前ASP.NET上下文中提取信息来添加标头.要将IClientMessageInspector附加到客户端代理,您只需创建一个IEndpointBehavior,然后通过config将其添加到端点(请参阅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);
}
Run Code Online (Sandbox Code Playgroud)

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