WCF-TransportWithMessageCredential HTTP-запрос не авторизован с помощью схемы аутентификации клиента «Anonymous». - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь настроить аутентификацию WCF с UserName, но безуспешно, я пробовал много решений, которые я уже нашел, но мне кажется, ничего не работает.

HTTP-запроснесанкционированный со схемой аутентификации клиента «Аноним».Заголовок аутентификации, полученный от сервера, был 'Negotiate, NTLM, Basic realm = "localhost".

Настройка сервера

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="basicHttpBindingConfiguration">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" negotiateServiceCredential="false" />
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<services>
  <service name="Namespace.Service" behaviorConfiguration="wsHttpBehavior">
    <endpoint binding="wsHttpBinding" bindingConfiguration="basicHttpBindingConfiguration" name="Soap" bindingNamespace="/WebServices" contract="Namespace.IService">
    </endpoint>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" name="mex" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="wsHttpBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="UserNamePasswordValidator, WebApplication" />
        <!--<serviceCertificate findValue="ServiceModelSamples-HTTPS-Server" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />-->
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

На стороне клиента

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="Soap">
                <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" />
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://localhost:85/WebServices/Service.svc"
            binding="wsHttpBinding" bindingConfiguration="Soap" contract="ServiceReference1.IService"
            name="Soap" />
    </client>
</system.serviceModel>

Вот моя конфигурация IIS enter image description here

В большинстве решений, которые я обнаружил, используется Windows Transport, мне нужна аутентификация только через имя пользователя.

Я проверяю это:

Я пробовал безопасность mode = "Сообщение" иsecurity mode = "TransportWithMessageCredential" безуспешно

Мой код клиента выглядит так:

 // Instantiate the proxy  
 var  proxy = new ServiceClient();

 proxy.ClientCredentials.UserName.UserName = "username";
 proxy.ClientCredentials.UserName.Password = "password";

Может кто-нибудь проверить мою конфигурацию и сказать, что я неправильно настраиваю?

Редактировать: это служба внутри приложения ASP.Net MVC5. Может ли это быть проблемой?

1 Ответ

0 голосов
/ 24 апреля 2019

Возможно, что-то не так с строкой свойства customUserNamePasswordValidatorType . Обычно это следующая форма

customUserNamePasswordValidatorType="Namespace.MyCustUserNamePasswordVal,Namespace"

Можете ли вы получить доступ к WSDL хостинга? Кроме того, достаточно включить анонимную аутентификацию, чтобы включить аутентификацию других пользователей.
Вот моя конфигурация, я использовал упрощенную конфигурацию, которая будет поддерживаться в WCF4.5, желаю, чтобы она была вам полезна.

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceCredentials>
            <userNameAuthentication customUserNamePasswordValidatorType="WcfService1.CustUserNamePasswordVal,WcfService1" userNamePasswordValidationMode="Custom"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding>
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="wsHttpBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...