maxdm написал:А выложите примерчик простенький - гляну повнимательнее.
Ситуация следующая: на сервере простейший сервис, возвращающий дату, код с вашего позволения опускаю. Вся соль в конфигурации байндингов.
Клиентская конфигурация с двумя байндингами:
- анонимным доступ поверх https (wsHttpBinding)
- username/password-аутентификация поверх https (чтобы такой байндинг сделать использовался customBinding с набором стандартных элементов)
Код:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="https_anon">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
<customBinding>
<binding name="UserNameOverTransport">
<security authenticationMode="SecureConversation">
<secureConversationBootstrap authenticationMode="UserNameOverTransport" />
</security>
<textMessageEncoding />
<httpsTransport />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="https://myserver/testapp/infrastructureservice.svc/anon"
binding="wsHttpBinding" bindingConfiguration="https_anon"
contract="Aksicom.IInfrastructureService" name="https" />
<endpoint address="https://myserver/testapp/infrastructureservice.svc"
binding="customBinding" bindingConfiguration="UserNameOverTransport"
contract="Aksicom.IInfrastructureService" name="https_custom" />
</client>
</system.serviceModel>
На сервере аналогичные байндинги, плюс кастомный валидатор username/password, который ничего не делает (код опять же опускаю, если надо выложу).
Через wsHttpBinding/"https_anon" все работает.
Через customBinding/"UserNameOverTransport" не работает - на клиенте возникает исключение:
An error occured: System.NotSupportedException: The certificate key algorithm is not supported.
Server stack trace:
at System.Security.Cryptography.X509Certificates.PublicKey.get_Key()
at System.IdentityModel.Claims.X509CertificateClaimSet.InitializeClaimsCore()
at System.IdentityModel.Claims.X509CertificateClaimSet.EnsureClaims()
at System.IdentityModel.Claims.X509CertificateClaimSet.<FindClaims>d__0.MoveNext()
at System.ServiceModel.Security.SecurityUtils.GetPrimaryIdentityClaim(AuthorizationContext authContext)
at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.SoapSecurityOutputSession.Initialize(SecurityToken sessionToken, SecuritySessionClientSettings`1 settings)
at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySimplexSessionChannel.InitializeSession(SecurityToken sessionToken)
at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.InitializeSecurityState(SecurityToken sessionToken)
at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OpenCore(SecurityToken sessionToken, TimeSpan timeout)
at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
После установки Sharpei работают оба байндинга.
Отредактировано пользователем 14 февраля 2012 г. 21:28:03(UTC)
| Причина: Не указана