2009-10-20 62 views
3

我有2个应用程序;一个是ASP.NET 3.5 Ajax应用程序(客户端),另一个是WCF Web应用程序(后端)。发送经过身份验证的用户WCF应用程序

这些应用程序在IIS 7的后端应用程序已经启用的net.tcp和HTTP绑定部署在一个单独的Windows Server 2008;有些服务在netTcpBinding下暴露,其他服务在basicHttpBinding下暴露;该绑定没有配置任何安全性。

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

回答

5

如果不真正想实现在后端服务的安全性,只是希望能够审核用户身份(这意味着你实际上TRUST是谁送你的身份信息),可以考虑通过身份信息通过每个请求的自定义标题。

要做到这一点,您可以创建一个自定义的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属性使用它的方法中“手动”地检索标题。

相关问题