Проверка подлинности службы WCF с использованием System.Web.ApplicationServices.AuthenticationService, я не могу пройти проверку подлинности для поставщика членства - PullRequest
3 голосов
/ 17 сентября 2010

Я пытаюсь пройти аутентификацию с использованием службы аутентификации и моего поставщика членства. В идеале я хочу позвонить своему провайдеру членства, но перед тем, как поразить моего провайдера, я разбомблюсь. Говорит, что токен не может быть проверен. Проверяя мой журнал ошибок, кажется, что я пытаюсь пройти аутентификацию с использованием аутентификации Windows. Это не то, что я собираюсь сделать. Это веб с файлом SVC. Я использую svcUtil и генерирую клиента из WSDL. У меня есть тестовая страница в приложении, с которой я использую клиент. Это просто тестовая страница и не будет развернута. Я вижу, что встроенная проверка подлинности Windows проверена в IIS, что кажется неправильным, но если я сниму флажок, Visual Studio не будет отлаживаться. В любом случае я смотрю в журнале событий и получаю две ошибки

Logon Failure:
 Reason:        Unknown user name or bad password
 User Name:    sandagtestuser
 Domain:        
 Logon Type:    8
 Logon Process:    Advapi  
 Authentication Package:    MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
 Workstation Name:    SDD-CK

Logon attempt by: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
Logon account:  sandagtestuser
Source Workstation: SDD-CK
Error Code: 0xC0000064

Вот привязки в web.config. Обратите внимание, что я пытаюсь использовать SSL и HTTPS. Это мой первый удар по безопасности WCF

<system.serviceModel>
        <client>
        <endpoint address="https://SDD-CK/ATISServices/Services/AuthService.svc/AuthService"
              binding="basicHttpBinding" bindingConfiguration="userHttps_AuthenticationService"
              contract="AuthenticationService" name="userHttps_AuthenticationService" >
        </endpoint>
    </client>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <behaviors>
<serviceBehaviors>
              <behavior name="ATISServices.AuthServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <basicHttpBinding>

            <binding name="userHttps_AuthenticationService" closeTimeout="00:01:00"
               openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
               allowCookies="true" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
               maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
               messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
               useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="TransportWithMessageCredential">
                    <transport proxyCredentialType="None" clientCredentialType="None" realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />                       
                </security>
            </binding>
            <binding name="basic_auth_config">
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
        </basicHttpBinding>

    </bindings>
    <services>

        <service behaviorConfiguration="ATISServices.AuthServiceBehavior"
            name="System.Web.ApplicationServices.AuthenticationService">

            <endpoint binding="basicHttpBinding" bindingName="userHttps" bindingConfiguration="basic_auth_config"
                bindingNamespace="http://asp.net/ApplicationServices/v200"
                contract="System.Web.ApplicationServices.AuthenticationService"
                address="AuthService"/>

            <endpoint address="mex" binding="mexHttpsBinding" bindingConfiguration=""
                contract="IMetadataExchange" />  

        </service>
    </services>
</system.serviceModel>

Возможно, какой-нибудь гуру из WCF поможет мне решить проблему. Я вижу, как учетные данные поступают на сервер через журнал событий, поэтому я не должен быть слишком далеко. Фактическое сообщение InnerException по ошибке: At least one security token in the message could not be validated.

Наконец, вот некоторые дополнительные настройки web.config, которые могут представлять интерес.

 <system.web.extensions>
    <scripting>
        <webServices>
            <authenticationService enabled="true" requireSSL="true"/>
        </webServices>

    </scripting>
</system.web.extensions>

 <authentication mode="Forms" >
        <forms cookieless="UseCookies" />
    </authentication>

 <membership defaultProvider="KCMembershipProvider">
        <providers>
            <clear/>
            <add
            name="KCMembershipProvider"
            applicationName="/"
            type="zcore.MembershipProvider.KCMembershipProvider, zcore.MembershipProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"  />
        </providers>
    </membership>

Любая помощь или советы на этом этапе будут с благодарностью. Я боролся с этим в течение двух дней. Я тоже использую сертификаты. Я сделал их с помощью инструмента 'makecert'. Одним из них является Cert Authority, а другим - сертификат «localhost», использующий указанный Authority. Я также использовал httpcfg и установил отпечаток сертификата на порт 9307, однако, когда я помещаю «: 9307» в адрес службы, я активно получаю отказ в соединении. Я действительно ценю любую помощь здесь.

Приветствия
~ ck в Сан-Диего

1 Ответ

1 голос
/ 17 сентября 2010

Это на самом деле заставило его работать.Добавление этого к поведению службы.

 <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="KCMembershipProvider"/>
      </serviceCredentials>
...