Запрос 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, нет ошибок политики, при этом создается правильная цепочка сертификатов.

enter image description here

У меня есть мой CA в доверенном корне и сертификате server/client в магазине TrustedPeople. Также, если я перейду на сайт из браузера, я вижу, что страница вернулась. Нет ошибок enter image description here

Я обновил IIS до того, что я считаю необходимым, связал сертификат в IIS enter image description here

и через командную строку ниже. enter image description here

Я установил параметры SSL для приема сертификатов enter image description here

и активировала анонимную аутентификацию. enter image description here

Кто-нибудь знает, какие шаги я сделал неправильно или вижу что-то не так? Я продолжаю получать ту же ошибку "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 это будет отображаться с "Дружественным именем". Мне потребовались дни, чтобы понять. Как только я импортировал закрытый ключ, Анонимная ошибка ушла, и все было хорошо!