Запрос HTTP был запрещен с помощью схемы аутентификации клиента "Аноним". Удаленный сервер ответил на ошибку: (403) Запрещено
Я пытаюсь создать безопасный веб-сервис.
Вот реализация контракта и услуги
[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;
}
}
Здесь у меня есть служебный код
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();
Вот код клиента
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();
Служба работает нормально, и когда выполняется проверка ServicePointManager.ServerCertificateValidationCallback, нет ошибок политики, при этом создается правильная цепочка сертификатов.
У меня есть мой CA в доверенном корне и сертификате server/client в магазине TrustedPeople. Также, если я перейду на сайт из браузера, я вижу, что страница вернулась. Нет ошибок
Я обновил IIS до того, что я считаю необходимым, связал сертификат в IIS
и через командную строку ниже.
Я установил параметры SSL для приема сертификатов
и активировала анонимную аутентификацию.
Кто-нибудь знает, какие шаги я сделал неправильно или вижу что-то не так? Я продолжаю получать ту же ошибку "HTTP-запрос был запрещен с помощью схемы проверки подлинности клиента" Аноним ".
Ответы
Ответ 1
Когда вы размещаете службу WCF в IIS с сертификатом типа сертификата типа безопасности и клиента, поместите свой сертификат клиента в хранилище Root и включите анонимную аутентификацию в IIS. Включить анонимную аутентификацию в IIS. Но самое главное, добавьте свой сертификат в корневой магазин.
Ответ 2
Если вы запускаете самообслуживаемую службу WCF (без IIS), вы можете включить анонимных клиентов, добавив в конфиг файл (на сервере):
<behaviors>
<serviceBehaviors>
<behavior name="limitedAuthBehavior">
<serviceAuthenticationManager authenticationSchemes="Anonymous, Basic, Digest, Negotiate"/>
<!-- ... -->
</behavior>
</serviceBehaviors>
</behaviors>
Кроме того, установите для параметра clientCredentialType значение "InheritedFromHost":
<bindings>
<basicHttpBinding>
<binding name="secureBinding">
<security mode="Transport">
<transport clientCredentialType="InheritedFromHost" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Рекомендации:
Использование нескольких схем проверки подлинности с помощью WCF
Общие сведения об аутентификации HTTP
Ответ 3
У нас появилось это сообщение об ошибке, и для нас было решено, что разрешения для обработчиков Handler Mappings не были включены для сценария. Вы можете включить это в IIS в разделе "Отображения обработчиков"> "Редактировать accessPolicy
или добавив Script
в атрибут accessPolicy
узла handlers
в вашем web.config:
<system.webServer>
<handlers accessPolicy="Script">
...
</handlers>
</system.webServer>
Ответ 4
Другая причина для этого - сам сертификат на сервере, на который вы нажимаете. Убедитесь, что вы импортировали ЧАСТНЫЙ КЛЮЧ. В MMC это будет отображаться с "Дружественным именем". Мне потребовались дни, чтобы понять. Как только я импортировал закрытый ключ, Анонимная ошибка ушла, и все было хорошо!