2012-03-05 4 views
1

Я создал веб-службу WCF для отдыха. Однако клиент запросил блокировку службы с помощью базовой проверки подлинности, но разрешил им предоставлять токен авторизации для первого ответа, а не для вызова. К сожалению, у меня только IIS 6 на моей тестовой машинеRestful WCF и базовая аутентификация через Fidder

Мне действительно нужно симулировать базовую аутентификацию, поэтому я делаю это над анонимным и выдавая ошибку, если токен авторизации неверен. Однако аутентификации маркер не доступен для ФОС

http://localhost/test.svc/get/token/

Content-Type: применение/х-WWW-форм-urlencoded

Авторизация: Basic Base64Value

Если удалить анонимным и добавить основной в ИИС. Все, что я получаю, это 401. Я думаю, что в IIS выполняется проверка подлинности перед WCF.

В идеале я просто хотел бы получить анонимный доступ и получить доступ к заголовку авторизации.

Как я могу получить заголовок AUTH

+0

Вы хотите способ чтения HTTP заголовки в вашем методе веб-службы WCF Rest? – CSharpenter

ответ

1

Вашего предположение для этого неоспоримого вопрос о IIS 6, вероятно, прав.

Я только что создал WCF службы «xxx.svc» и размещение его в IIS (7.5), и когда я просил его Fiddler2 с правильным заголовком авторизации, он не послал HTTP 401.

Я отправлю свой код, чтобы вы протестировали его на IIS 6. Если он все еще дает вам HTTP 401, то это, несомненно, проблема с IIS 6, если вы не пытаетесь сравнить и сравнить свой код с моим и посмотреть, какие конфигурации разные.

web.config:

<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="webHttpBindConfig"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" proxyCredentialType="None" /> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service name="MyTestSvc.MyService"> 
     <endpoint address="http://localhost/TestBasicAuth/Service1.svc" behaviorConfiguration="webHttpEndpointBehavior" 
      binding="webHttpBinding" bindingConfiguration="webHttpBindConfig" 
      name="webHttpBindingEndpoint" contract="MyTestSvc.IMyService" /> 
     <host> 
      <baseAddresses> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webHttpEndpointBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

Service1.svc

<%@ ServiceHost Language="C#" Debug="true" Service="MyTestSvc.MyService" CodeBehind="Service1.svc.cs" %> 

IService1.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using System.Text; 

namespace MyTestSvc 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together. 
    [ServiceContract] 
    public interface IMyService 
    { 

     [OperationContract] 
     [WebGet([email protected]"/Hello")] 
     string GetData(); 

    } 
} 

и, наконец: Service1.svc.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using System.Text; 

namespace MyTestSvc 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together. 
    public class MyService : IMyService 
    { 
     public string GetData() 
     { 
      WebOperationContext webCtx = WebOperationContext.Current; 
      IncomingWebRequestContext incomingCtx = webCtx.IncomingRequest; 
      string hdrVal = incomingCtx.Headers["Authorization"]; 

      return string.Format("Authorization: {0}", hdrVal); 
     } 
    } 
} 

скрипача Результаты: Fiddler Composer request

fiddler inspector, request/response raw

+0

Это то, что я делаю. Но заголовка авторизации нет – Chris

+0

И вы установили ** basic ** в качестве режима аутентификации виртуального каталога, на котором размещен ваш WCF svc? – CSharpenter

+0

Да, я установил базовое значение, но когда базовый параметр установлен, заголовок auth есть, но когда это строка base64, шаги IIS в причинах 401 до моего кода. – Chris