Измените clientCredentialType на UserName, но с использованием сертификата x509 - PullRequest
1 голос
/ 29 июня 2011

Я сделал приложение wcf и клиент.Приложение WCF.должен знать, какой пользователь и пароль получили доступ к сервису.Вот что я сделал: Конфигурация сервера:

    <?xml version="1.0"?>
     <configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="wsHttpEndpointBinding">
                    <security>
                        <message clientCredentialType="Certificate" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="Auth">
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceCredentials>
                        <clientCertificate>
                            <authentication certificateValidationMode="PeerTrust"/>
                        </clientCertificate>
                        <serviceCertificate findValue="WCfServer"
                        storeLocation="CurrentUser"
                        storeName="My"
                        x509FindType="FindBySubjectName" />
                    </serviceCredentials>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="Auth" name="Service">
                <endpoint address="" binding="wsHttpBinding"       bindingConfiguration="wsHttpEndpointBinding" contract="IService"/>
            </service>
        </services>
    </system.serviceModel>
    <system.web>
        <compilation debug="true"/>
    </system.web>
</configuration>

Конфигурация клиента:

     <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
    <system.serviceModel>
        <bindings>
   <wsHttpBinding>
    <binding name="WSHttpBinding_IService" closeTimeout="00:01:00"
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
     maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
     textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <reliableSession ordered="true" inactivityTimeout="00:10:00"
      enabled="false" />
     <security mode="Message">
      <transport clientCredentialType="Windows" proxyCredentialType="None"
       realm="" />
      <message clientCredentialType="Certificate" negotiateServiceCredential="true" />
     </security>
    </binding>
   </wsHttpBinding>
  </bindings>
        <behaviors>
            <endpointBehaviors>
                <behavior name="CustomBehavior">
                    <clientCredentials>
                        <clientCertificate findValue="WcfClient" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="My" />
                        <serviceCertificate>
                            <authentication certificateValidationMode="PeerTrust"/>
                        </serviceCertificate>
                    </clientCredentials>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <client>
            <endpoint address="http://localhost:30341/WCFAuthTest/Service.svc"
             binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService"
             contract="Service.IService" name="WSHttpBinding_IService" behaviorConfiguration="CustomBehavior">
                <identity>
                    <dns value="WcfServer" />
                </identity>
            </endpoint>
  </client>
    </system.serviceModel>
</configuration>

Как я генерировал сертификаты: http://www.codeproject.com/KB/WCF/9StepsWCF.aspx Операция обслуживания:

    public string TestAccess()
{
    return OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
}

Клиент:

            ServiceClient client = new ServiceClient();
        client.ClientCredentials.UserName.UserName = "Admin";
        client.ClientCredentials.UserName.Password = "123";
        Console.WriteLine(client.TestAccess());
        Console.ReadLine();

И программа должна вернуть администратора, но это не так: http://img27.imageshack.us/img27/3104/returnz.png
Я знаю, что мне нужно изменить clientCredentialType на UserName, но это дает мне ошибку

1 Ответ

1 голос
/ 29 июня 2011

Если вы хотите передать имя пользователя и пароль, вы должны установить тип учетных данных клиента UserName. Установка его в сертификат для использования клиентских сертификатов. Вот некоторые как статьи .

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