2014-01-21 7 views
1

WCF REST 서비스를 만들었으며 사용자 정의 인증을하려고합니다 (http 및 https에서 작동해야 함).WCF REST 기본 인증 - 인증 헤더를 설정할 수 없습니다.

저는 Custome 서비스 인증 관리자를 사용하여 인증 헤더를 확인하고 유효성을 검사합니다.

Fiddler를 사용하여 서비스를 호출하고 Authorization 헤더를 요청과 함께 전달할 때 서비스 인증 관리자에서 올바르게 수신하고 있습니다.

그러나 WCFChannelFactory에서 자격 증명을 설정할 때 서비스의 Authorization 헤더를받지 못했습니다. 권한 헤더는 WCFChannelFactory에 의해 작성되어 요청과 함께 전달되어야합니다.

클라이언트 코드는 다음과 같습니다 :

WebChannelFactory<IDataService> factory = new WebChannelFactory<IDataService>("DataServiceClient1"); 
factory.Credentials.UserName.UserName = "user1"; 
factory.Credentials.UserName.Password = "password123"; 
var client = factory.CreateChannel(); 
var data = client.GetData1("Microsoft"); 
Console.WriteLine("Get response : {0}", data); 

클라이언트 서비스 구성은 다음과 같습니다 :

<system.serviceModel> 
    <client> 
     <endpoint address="http://localhost.fiddler:50179/DataService.svc" 
       binding="webHttpBinding" bindingConfiguration="auth" 
       contract="RESTWebServiceSpike.IDataService" 
       behaviorConfiguration="web" 
       name="DataServiceClient1"> 
     </endpoint> 
    </client> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <webHttpBinding> 
     <binding name="auth"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    </system.serviceModel> 

내 서비스 구성은 다음과 같습니다 :

<services> 
    <service name="RESTWebServiceSpike.DataService" behaviorConfiguration="DataServiceBehaviour"> 
    <endpoint address="" binding="webHttpBinding" 
       contract="RESTWebServiceSpike.IDataService" behaviorConfiguration="web"> 
    </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="DataServiceBehaviour"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"/> 
     <serviceAuthorization serviceAuthorizationManagerType="RESTWebServiceImpl.AuthorizationManager, RESTWebServiceImpl" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="web"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

내가 손님 서비스를 사용하고 있습니다 권한 부여 관리자는 권한 헤더를 점검하고 유효성을 검증합니다.

답변

0

후손를 들어, 여기에 내가이 문제에 발견 된 솔루션입니다 :

먼저, 클라이언트에 <service></service> 태그를 꺼내.

그런 다음 서비스에 대한 호출을 OperationContextScope에 랩핑해야합니다. 여기에는 헤더를 추가합니다.

다음
using (new OperationContextScope((IClientChannel)client)) 
{ 
    HttpRequestMessageProperty requestProperty = new HttpRequestMessageProperty(); 
    string credentials = string.Format("{0}:{1}", _username, _password); 
    requestProperty.Headers["Authorization"] = string.Format("Basic {0}", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(credentials))); 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty; 
    data = client.GetData1(); 
} 

는 참조의 MSDN 지점입니다 : 예를 들어

http://blogs.msdn.com/b/drnick/archive/2008/07/08/adding-headers-to-a-call-http-version.aspx

1

나는 경우에 내가해야 할이 늦게하지만이 게시물 그래서이를 기입하기로 결정을 통해 내가 달릴 알고 이것을 다시 기억하십시오. 이것은 나를 위해 일한 :

  1. 를 메시지 속성을 만듭니다

    Public Class AuthenticationHeaderBehavior 
    Implements IEndpointBehavior 
    
    Private ReadOnly itsUser As String 
    Private ReadOnly itsPass As String 
    
    Public Sub New(ByVal user As String, ByVal pass As String) 
        MyBase.New() 
        itsUser = user 
        itsPass = pass 
    End Sub 
    
    Public Sub AddBindingParameters(endpoint As ServiceEndpoint, bindingParameters As BindingParameterCollection) Implements IEndpointBehavior.AddBindingParameters 
    End Sub 
    
    Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior 
        clientRuntime.MessageInspectors.Add(New AuthenticationHeader(itsUser, itsPass)) 
    End Sub 
    
    Public Sub ApplyDispatchBehavior(endpoint As ServiceEndpoint, endpointDispatcher As EndpointDispatcher) Implements IEndpointBehavior.ApplyDispatchBehavior 
    End Sub 
    
    Public Sub Validate(endpoint As ServiceEndpoint) Implements IEndpointBehavior.Validate 
    End Sub 
    End Class 
    
  2. 이 엔드 포인트에 추가 :

    Dim binding As New WebHttpBinding(WebHttpSecurityMode.Transport) 
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None 
    
        ChlFactory = New WebChannelFactory(Of IMyServiceContract)(binding, New Uri(url)) 
        ChlFactory.Endpoint.Behaviors.Add(New WebHttpBehavior()) 
        ChlFactory.Endpoint.Behaviors.Add(New AuthenticationHeaderBehavior(user, pass)) 
        Channel = ChlFactory.CreateChannel() 
    

Public Class AuthenticationHeader 
    Implements IClientMessageInspector 

Private itsUser As String 
Private itsPass As String 

Public Sub New(ByVal user As String, ByVal pass As String) 
    itsUser = user 
    itsPass = pass 
End Sub 

Public Sub AfterReceiveReply(ByRef reply As Message, correlationState As Object) Implements IClientMessageInspector.AfterReceiveReply 
    Console.WriteLine("Received the following reply: '{0}'", reply.ToString()) 
End Sub 

Public Function BeforeSendRequest(ByRef request As Message, channel As IClientChannel) As Object Implements IClientMessageInspector.BeforeSendRequest 
    Dim hrmp As HttpRequestMessageProperty = request.Properties("httpRequest") 
    Dim encoded As String = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(itsUser + ":" + itsPass)) 
    hrmp.Headers.Add("Authorization", "Basic " + encoded) 
    Return request 
    End Function 
End Class 
  • 는 행동 쓰기