Пользовательское имя пользователя / пароль в ssl webservice

У меня есть служба WCF basichttpbinding, которая работала в режиме безопасности транспорта. Это работает нормально, однако я хотел бы аутентифицировать пользователя, который запрашивает эту услугу, поэтому попытался использовать режим безопасности TransportWithMessagCredential и сообщение clientCredentialType из UserName и добавил поведение службы для вызова пользовательского средства проверки пароля. Моя проблема, когда я пытаюсь использовать visual studio для вызова ссылки, я получаю сообщение об ошибке, в котором говорится, что служба не может быть найдена. Пожалуйста, найдите мой код ниже и предложите любые изменения, которые мне могут понадобиться, чтобы заставить это работать, и предложите мне ввести имя пользователя / пароль при попытке добавить службу.

Web.config

<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<sources>
  <source name="System.ServiceModel" switchValue="Information, ActivityTracing"
    propagateActivity="true">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add initializeData="WcfTraces.svclog" type="System.Diagnostics.XmlWriterTraceListener"
        name="traceListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelMessageLoggingListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>
<sharedListeners>
  <add initializeData="c:\users\**\web_messages.svclog"
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral,     PublicKeyToken=***"
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
</sharedListeners>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
  <messageLogging logEntireMessage="true" logMalformedMessages="true"
    logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" />
</diagnostics>
<bindings>
  <basicHttpBinding>
    <binding name="basicBindingConfig">
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None" />
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="ServiceBehavior" name="nameSpaceX.Service">
    <endpoint address="https://************:443/***.svc/"
      binding="basicHttpBinding" bindingConfiguration="basicBindingConfig"
      contract="nameSpaceY.IService">
      <identity>
        <certificateReference x509FindType="FindByThumbprint" findValue="****************" />
      </identity>
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"
        httpsGetUrl="https://*****:443/***.svc" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom"
          customUserNamePasswordValidatorType="namespaceX.UserNameValidator, namespaceX" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

</configuration>

userNameValidator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

namespace namespaceX
{
class UserNameValidator: UserNamePasswordValidator
{
    public override void Validate(string username, string password)
    {
        if(username == "test" && password == "1234")
            return;
        throw new SecurityTokenException("Incorrect username or Password");
    }
}
}

1 ответ

Вам не нужен путь к *.svc здесь. Обычно httpsGetUrl атрибут пропущен или хранит...?wsdl

<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"
  httpsGetUrl="https://*****:443/***.svc" />

Это было сказано с предположением, что URL здесь такой же, как и в конечной точке сервиса. У Ti должны быть разные URL, потому что один - это реализация, а второй - метаданные.

Другие вопросы по тегам