2014-01-21 6 views
1

Я создал службу WCF REST, и я пытаюсь выполнить пользовательскую аутентификацию (так как она должна работать на http и https).WCF REST Базовая аутентификация - не удается установить заголовок авторизации

Я использую диспетчер авторизации службы custome для проверки и проверки заголовка авторизации.

Когда я вызываю услугу с помощью Fiddler и передаю заголовок авторизации с запросом, я получаю его правильно в диспетчере авторизации службы.

Но когда я устанавливаю учетные данные в WCFChannelFactory, я не получаю заголовок авторизации в службе. Я ожидаю, что заголовок авторизации должен быть создан WCFChannelFactory и передан с запросом.

Клиентский код, как показано ниже: Конфигурация Service

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

Client, как показано ниже:

<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 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 
    
  2. Написать Поведение:

    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 
    
  3. Добавьте его в конечной точке:

    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() 
    

 Смежные вопросы

  • Нет связанных вопросов^_^