2012-02-06 3 views
2

У меня есть служба RESTful WCF, которую я хочу разместить на сервере Windows Server 2008 R2. В настоящее время он размещен как приложение на существующем веб-сайте. Для порта 443. Используется самоподписанный сертификат.Служба WCF только через HTTPS

Я бы хотел, чтобы сервис обслуживался только через HTTPS. В настройках SSL для приложения я установил его в «Требовать SSL». Конфигурации конечных точек выглядит следующим образом:

<system.serviceModel> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="Rest"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 

    <behavior> 
     <serviceAuthorization serviceAuthorizationManagerType="ACME.MyAuthorizationManager, ACME.WS.Authorization" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
<standardEndpoints> 

    <webHttpEndpoint> 

    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" /> 
    </webHttpEndpoint> 
</standardEndpoints> 

Тем не менее, я получаю 403 ответов при попытке доступа к услуге через браузер (например, https://example.com/myservices/baz-service/yip-resource).

Пропустил ли я что-нибудь во время настройки?

+0

Как вы пытаетесь получить доступ к сервису? Из браузера или из прокси-сервера wcf? – BNL

+0

Какова конфигурация Binding/Endpoint для вашего svc? –

+0

Первоначальная попытка доступа выполняется через браузер. Я добавил конфигурацию конечной точки. – Bullines

ответ

2

Установка параметра «Требовать SSL» в IIS означает, что вы выполняете аутентификацию с использованием клиентских сертификатов. Просто установите этот параметр, чтобы игнорировать или отключать этот параметр, если у вас нет никакой проверки подлинности сертификата клиента.

Чтобы избежать обслуживания только на HTTPS, удалите привязку HTTP с помощью параметра «Связывание» на вашем веб-сайте. Else просто выставляют ваши привязки для использования транспорта в качестве механизма безопасности, и это должно заботиться о том, чтобы ваш сервис WCF обслуживался только на HTTPS.

UPDATE:

Пожалуйста, найдите того, как у меня есть RESTful сервис, размещенный на IIS с https:

[ServiceContract] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    public class RestService 
    { 
     // TODO: Implement the collection resource that will contain the SampleItem instances 

     private static List<SampleItem> sampleCollection = new List<SampleItem>(); 

     [WebGet(UriTemplate = "/get-Collection")] 
     public List<SampleItem> GetCollection() 
     { 
      // TODO: Replace the current implementation to return a collection of SampleItem instances 
      if (sampleCollection.Count == 0) 
      { 
       sampleCollection = new List<SampleItem>(); 
       sampleCollection.Add(new SampleItem() { Id = 1, StringValue = "Hello 1" }); 
       sampleCollection.Add(new SampleItem() { Id = 2, StringValue = "Hello 2" }); 
       sampleCollection.Add(new SampleItem() { Id = 3, StringValue = "Hello 3" }); 
       sampleCollection.Add(new SampleItem() { Id = 4, StringValue = "Hello 4" }); 
       sampleCollection.Add(new SampleItem() { Id = 5, StringValue = "Hello 5" }); 
      } 
      return sampleCollection; 
     } 
} 

Мои Global.asax:

public class Global : HttpApplication 
    { 
     void Application_Start(object sender, EventArgs e) 
     { 
      RegisterRoutes(); 
     } 

     private void RegisterRoutes() 
     { 
      // Edit the base address of Service1 by replacing the "Service1" string below 
      RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(RestService))); 
     } 
    } 

Мой файл web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 


    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </modules> 
    </system.webServer> 

    <system.serviceModel> 
    <diagnostics> 
     <messageLogging logEntireMessage="true" logKnownPii="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" /> 
     <endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true" /> 
    </diagnostics> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <!-- 
      Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
      via the attributes on the <standardEndpoint> element below 
     --> 
     <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" maxBufferSize="500000" maxReceivedMessageSize="500000">   
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />   
     </standardEndpoint> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name=""> 
       <serviceCredentials> 
        <serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="localhost" /> 
       </serviceCredentials> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Теперь мой IIS имеет Https связывание указано:

Site Bindings in IIS

Теперь мой виртуальный каталог настроен с именем XmlRestService и, следовательно, когда я просматриваю к ресурсу я получаю ниже выходные:

Output from a REST Service on HTTPS

+0

В настоящее время у меня есть «Клиентские сертификаты», равные «Игнорировать». – Bullines

+0

Вам не нужно иметь раздел readerQuotas, но если ваш сервис должен отправить большое количество данных, лучше оставить его. – Rajesh

+0

Используя этот стандартEndpoint, вы получите следующее: Не удалось найти базовый адрес, соответствующий схеме http для конечной точки с привязкой WebHttpBinding. Схемы зарегистрированных базовых адресов: [https]. – Bullines

0

Существует множество различных способов реализации WCF. Этот ответ, как и многие, не работал для меня. Я придумал следующее быстрое решение. Я думаю, что это, наверное, самое универсальное и простое решение. Это не может считаться красноречивым, но для большинства из нас это не оценено в нашей работе. Вы можете попробовать перенаправить, по крайней мере, для запросов GET, вместо того, чтобы бросать ошибку.

#if !DEBUG 
    // check secure connection, raise error if not secure 
    IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest; 
    if (!request.UriTemplateMatch.BaseUri.AbsoluteUri.StartsWith("https://")) 
    { 
     throw new WebProtocolException(HttpStatusCode.BadRequest, "Https is required to use this service.", null); 
    } 
#endif 
Смежные вопросы