Как клиент WCF сохраняет сеанс входа - PullRequest
1 голос
/ 20 марта 2012

У меня есть клиент WCF, подключающийся к службе WCF, размещенной в IIS через WsHttpBinding с уровнем безопасности сообщений и типом учетных данных клиента UserName.

В клиенте я указываю свое имя пользователя и пароль в экземпляре сгенерированногопрокси-класс, представляющий сервис.Один экземпляр прокси-сервера используется для всех последующих вызовов, и служба аутентифицирует эти учетные данные в настраиваемом валидаторе либо при явном вызове Open (), либо при первом вызове службы.Проверка выполняется только для этого первоначального вызова, а не для последующих вызовов.Например:

   var client = new MyServiceClient();
    client.ClientCredentials.UserName.UserName = "username";
    client.ClientCredentials.UserName.Password = "password";        client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =   
X509CertificateValidationMode.None;
    client.GetStuff1(); // authentication is made here
    client.GetStuff2(); // already authenticated, no further authentication. Why/How?
    client.GetStuff3(); // already authenticated, no further authentication. Why/How?

Как поддерживается этот сеанс?Как я могу настроить сервер и / или клиент так, чтобы аутентификация выполнялась для каждого вызова, а не для «сеанса», который, кажется, существует?Разве это не определяется <reliableSession>, который у меня отключен?

Класс обслуживания определяется следующими атрибутами:

[ServiceBehavior(IncludeExceptionDetailInFaults = true, AutomaticSessionShutdown = false, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

Файл app.config клиента выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="wsHttpBindingWithAuth" 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="200000000"
                    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="UserName" negotiateServiceCredential="true"
                            algorithmSuite="Default"/>
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://testmachine/MyService.svc"
                binding="wsHttpBinding" bindingConfiguration="wsHttpBindingWithAuth"
                contract="NewServiceIIS.IMyService" name="wsHttpBindingWithAuth">
                <identity>
                  <certificate encodedValue="ZZZZ" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

1 Ответ

1 голос
/ 20 марта 2012

Это было источником моего разочарования, и теперь это блаженство для вас (то есть вам не нужно снова вводить пользователя / пароль)!

Да, аутентификация хранится в channel.После открытия канала ClientCredentials не может быть изменено.Канал устанавливает контекст безопасности, который сохраняется в Канале.С wsHttpBinding и защитой сообщений это имя пользователя / пароль, которое отправляется на сервер каждый раз .

Это сделано специально.Единственный способ для повторной аутентификации - закрыть канал / прокси и создать новый прокси.


Если вам интересно, что такое установление контекста безопасности, посмотрите на Каковы последствияпараметр settingSecurityContext = "False", если я использую https?

...