2011-07-05 3 views
3

Comment puis-je configurer wcf web api service pour le transport HTTPS? Est-ce que quelqu'un sait combien cela va changer dans la version finale, puisque c'est l'un des domaines qu'ils disent va changer?Sécurité de l'API Web WCF

Répondre

6

Pour prendre en charge HTTPS, vous devez activer la sécurité du transport sur HttpBinding. Cela peut être fait en dérivant du HttpConfigurableServiceHostFactory et passer outre la CreateServiceHost comme ceci:

public class HypertextTransferProtocolSecureServiceHostFactory : HttpConfigurableServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     var configurationBuilder = HttpHostConfiguration.Create(); 

     var host = new HttpConfigurableServiceHost(serviceType, configurationBuilder, baseAddresses); 

     foreach (var endpoint in host.Description.Endpoints.Where(e => e.ListenUri.Scheme == "https")) 
     { 
      var binding = endpoint.Binding as HttpBinding; 

      if (binding != null) 
      { 
       binding.Security.Mode = HttpBindingSecurityMode.Transport; 
      } 
     } 
     return host; 
    } 
} 

Enfin, le HypertextTransferProtocolSecureServiceHostFactory doit être ajouté à la RouteTable:

RouteTable.Routes.Add(new ServiceRoute("routePrefix", new HypertextTransferProtocolSecureServiceHostFactory(), typeof(ServiceType))); 
+0

Merci beaucoup pour cette hskan: >} – Darth

5

Dans notre dernière goutte vous pouvez définir la liaison sans créer un nouvel hôte en utilisant l'objet HttpConfiguration. Il expose une méthode SetSecurity que vous pouvez définir pour changer le mode de sécurité.

+0

Glenn est-il un exemple de ceci quelque part? J'ai du mal à reconfigurer un service d'API Web pour travailler sur https. –

2

Voici ma configuration de Global.asax, je vérifie l'URI et puis j'utilise le mode correct. Fonctionne bien dans IIS et IIS Express. . . . mon objectif est de base via HTTPS, IIS mais explicite conserve l'URI HTTP dans le « liant » et à moins que vous traitez avec elle vous obtenez sucer dans une boucle sans fin (http://screencast.com/t/kHvM49dl6tP, http://screencast.com/t/5usIEy5jgPdX)

   var config = new HttpConfiguration 
         { 
          EnableTestClient = true, 
          IncludeExceptionDetail = true, 
          EnableHelpPage = true, 
          Security = (uri, binding) => 
              { 
               if (uri.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase)) 
                binding.Mode = HttpBindingSecurityMode.Transport; 
               else 
                binding.Mode = HttpBindingSecurityMode.TransportCredentialOnly; 

               binding.Transport.ClientCredentialType = HttpClientCredentialType.Basic; 
              }, 
          CreateInstance = ((t, i, h) => container.Resolve(t)) 
         };