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.
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
Ho aggiornato IIS a quello che pensa siano le richieste, legate il certificato in IIS
e tramite linea di comando di seguito.
ho impostato le impostazioni SSL per accettare i certificati
e abilitato l'autenticazione anonima.
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'."
Mi sono imbattuto in questa eccezione ma era dovuto al mio certificato SSL scadente. –
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. –