Restful WCF и базовая аутентификация через Fidder

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

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

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

Тип содержимого: application / x-www-form-urlencoded

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

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

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

Как получить заголовок аутентификации


person Chris    schedule 05.03.2012    source источник
comment
Вам нужен способ чтения HTTP-заголовков в методе веб-службы WCF Rest?   -  person CSharpenter    schedule 05.03.2012


Ответы (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(UriTemplate=@"/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: Запрос Fiddler Composer

инспектор скрипачей, запрос / ответ необработанный

person CSharpenter    schedule 05.03.2012
comment
Это то, что я делаю. Но заголовка авторизации там нет - person Chris; 06.03.2012
comment
И вы установили базовый в качестве режима аутентификации виртуального каталога, в котором размещен ваш WCF svc? - person CSharpenter; 06.03.2012
comment
Да, я теперь установил базовый, но когда базовый установлен, заголовок auth присутствует, но когда это строка base64, шаги IIS в a вызывают 401 до того, как мой код будет достигнут. - person Chris; 06.03.2012
comment
Это должно работать в IIS. Нам нужно сделать и другие вещи, связанные с IIS. Может быть, это IIS6. - person Chris; 06.03.2012