2009-10-20 6 views
3

2 개의 응용 프로그램이 있습니다. 하나는 ASP.NET 3.5 Ajax 응용 프로그램 (클라이언트)이고 다른 하나는 WCF 웹 응용 프로그램 (BackEnd)입니다.WCF 응용 프로그램에 인증 된 사용자 보내기

응용 프로그램은 IIS 7을 통해 별도의 Windows Server 2008에 배포됩니다. 백 엔드 응용 프로그램에는 net.tcp 및 http 바인딩이 있습니다. 일부 서비스는 netTcpBinding에서 노출되고 다른 서비스는 basicHttpBinding에서 노출됩니다. 바인딩은 보안을 구성하지 않습니다.

클라이언트 응용 프로그램은 FormsAuthentication을 사용하여 사용자를 인증합니다. netTcpBinding 아래의 모든 서비스는 클라이언트 응용 프로그램에서 사용됩니다. 백엔드에서는 어떤 사용자가 서비스를 호출하여 일부 감사 작업을 수행해야하는지 알 필요가 있습니다. 이것이 가능한가?

답변

5

실제로 백엔드 서비스에 대한 보안을 구현하지 않고 사용자 신원 (실제로 신원 정보를 보낸 사람을 신뢰 함을 의미)을 감사하기를 원할 경우 신원 정보 각 요청마다 맞춤 헤더를 통해

이렇게하려면 사용자 정의 IClientMessageInspector을 만들어서 현재 ASP.NET 컨텍스트의 정보를 BeforeSendRequest 구현 내부의 HttpContext.Current.User.Name과 같은 것으로 끌어와 헤더를 추가합니다. IClientMessageInspector를 클라이언트 프록시에 연결하려면 IEndpointBehavior을 작성한 다음 config를 통해 엔드 포인트에 추가하십시오 (샘플 코드는 the documentation for IClientMessageInspector을 확인하십시오). 당신이 IDispatchMessageInspector을 구현하고 거기에 감사를 수행하여 일반적인 감사를 고려할 수있는 서버 측에

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); 
} 

:

여기처럼 BeginSendRequest 구현이 보일 수 있습니다 무엇. 어느 쪽이든 아니면 그냥 OperationContext::IncomingMessageHeaders 속성을 통해 사용할 수있는 메서드 내에서 "수동으로"헤더를 검색 할 수 있습니다.

관련 문제