2014-10-02 38 views
11

Sto cercando di creare un servizio web sicuro.La richiesta HTTP è stata vietata con lo schema di autenticazione del client 'Anonimo'. Il server remoto ha restituito un errore: (403) Proibito

Ecco l'attuazione del contratto e il servizio

[ServiceContract()] 
public interface ICalculatorService 
{ 
    [OperationContract()] 
    int Add(int x, int y); 
} 

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class CalculatorService : ICalculatorService 
{ 
    public int Add(int x, int y) 
    { 
     return x + y; 
    } 
} 

Qui ho il codice di servizio

var b = new WSHttpBinding(SecurityMode.Transport); 
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
b.Security.Message.ClientCredentialType = MessageCredentialType.None; 

Type contractType = typeof(ICalculatorService); 
Type implementedContract = typeof(CalculatorService); 
Uri baseAddress = new Uri("https://localhost:8006/CalculatorService"); 
ServiceHost sh = new ServiceHost(implementedContract); 

sh.AddServiceEndpoint(contractType, b, baseAddress); 

//ServiceMetadataBehavior sm = new ServiceMetadataBehavior(); 
//sm.HttpsGetEnabled = true; 
//sm.HttpsGetUrl = new Uri("https://localhost:8006/CalculatorServiceMex"); 
//sh.Description.Behaviors.Add(sm); 

sh.Credentials.Peer.PeerAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust; 
     sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost"); 

sh.Open(); 
Console.WriteLine("Service is Listening"); 
Console.ReadLine(); 
sh.Close(); 

Ecco il codice del client

var b = new WSHttpBinding(SecurityMode.Transport); 
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
b.Security.Message.ClientCredentialType = MessageCredentialType.None; 

var factory = new ChannelFactory<ICalculatorService>(b); 
factory.Credentials.Peer.PeerAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust; 
     factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost"); 

var client = factory.CreateChannel(new EndpointAddress(new Uri("https://localhost:8006/CalculatorService"))); 

ServicePointManager.ServerCertificateValidationCallback = 
    ((sender, certificate, chain, sslPolicyErrors) => 
      { 
       return true; 
      }); 

ICommunicationObject comObject = client as ICommunicationObject; 
int result = -1; 
try 
{ 
    comObject.Open(); 
    result = client.Add(10, 2); 
} 
catch (Exception ex) 
{ 

} 
Console.WriteLine(string.Format("Service say 10 + 2 = {0}", -1)); 
Console.ReadLine(); 

Il servizio funziona benissimo e quando il ServicePointManager.ServerCertificateValidationControllo di ritorno è fatto non ci sono errori di politica , con la catena di certificati corretta costruita.

enter image description here

ho il mio CA nella radice di fiducia e il CERT server/client nel negozio TrustedPeople. Anche se navigo nel sito da un browser, vedo una pagina restituita. Nessun errore enter image description here

Ho aggiornato IIS a quello che pensa siano le richieste, legate il certificato in IIS enter image description here

e tramite linea di comando di seguito. enter image description here

ho impostato le impostazioni SSL per accettare i certificati enter image description here

e abilitato l'autenticazione anonima. enter image description here

Qualcuno sa quali passaggi non ho fatto correttamente o non vedo nulla di male? Continuo a ricevere lo stesso errore "La richiesta HTTP era vietata con lo schema di autenticazione del client 'Anonimo'."

+0

Mi sono imbattuto in questa eccezione ma era dovuto al mio certificato SSL scadente. –

+0

Esiste un'alternativa a IIS per WCF. Odio IIS, un giorno funziona e il prossimo inizia a dare tutti i tipi di errori che richiedono tutto il giorno per risolvere. –

risposta

0

Se si esegue self hosted servizio WCF (senza IIS) è possibile attivare i clienti anonymnous con l'aggiunta di file (in server) confing le folowings:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="limitedAuthBehavior"> 
      <serviceAuthenticationManager authenticationSchemes="Anonymous, Basic, Digest, Negotiate"/> 
      <!-- ... --> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

Inoltre, impostare clientCredentialType a "InheritedFromHost":

<bindings> 
     <basicHttpBinding> 
     <binding name="secureBinding"> 
      <security mode="Transport"> 
      <transport clientCredentialType="InheritedFromHost" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
</bindings> 

Riferimenti:

Using Multiple Authentication Schemes with WCF

Understanding HTTP Authentication

0

Abbiamo avuto questo messaggio di errore, e per noi la soluzione era che Mapping gestori funzionalità autorizzazioni non erano stati abilitati per Script.È possibile attivare questa in IIS sotto Mapping gestori> Modifica autorizzazioni Feature, o aggiungendo Script all'attributo accessPolicy del nodo handlers nel web.config:

<system.webServer> 
    <handlers accessPolicy="Script"> 
    ... 
    </handlers> 
</system.webServer> 
0

Un'altra ragione di questo è il certificato stesso sul server stai colpendo. Assicurati di aver importato il tasto PRIVATE. In MMC questo apparirà con un "Friendly Name". Mi ci sono voluti giorni per capire. Una volta importata la chiave privata, l'errore Anonymous è andato via e tutto andava bene!

Problemi correlati