Ну,
Так как я использовал самозаверяющий сертификат ... клиент расстроился из-за подлинности этого сертификата. Распространенными ошибками были AccessDenied (из-за неправильной настройки службы), а также «Произошла ошибка при согласовании учетных данных службы ...» или что-то в этом роде. Короче говоря, после прочтения поста этого замечательного сотрудника (Спасибо, Dev @ Work) Dev @ Work Мне удалось изменить его работу и добавить аутентификацию и авторизацию форм ASP.NET через провайдеров членства и роли на услуга.
Подводя итог, можно сказать, что у Dev @ Work была очень веская точка зрения. Клиенты WCF будут кричать о самозаверяющих сертификатах. Хитрость в том, чтобы сделать службу wcf полезной на сервере dev, заключается в том, чтобы лгать клиентам службы о подлинности сертификата, используемого для кодирования учетных данных клиента. Для этого любой wcf-клиент должен иметь поведениеConfiguration со своим serviceEndpoint и использовать собственный механизм проверки сертификата для аутентификации сертификата сервера. Это делается путем создания объекта, который наследуется от System.IdentityModel.Selectors.X509CertificateValidator , и путем переопределения метода Validate()
указанного объекта. Проверка успешна, если указанный объект не выдает ошибки:
<client>
<endpoint address="http://machine:5101/blah.svc"
binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_Iblah"
contract="Data.Iblah" name="WsHttpBinding_Iblah" behaviorConfiguration="BehaviorConfig">
<identity>
<certificate encodedValue="..." />
</identity>
</endpoint>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="BehaviorConfig">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="BlahConsole.X509Validator, BlahConsole"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
И пользовательский валидатор:
internal class X509Validator : System.IdentityModel.Selectors.X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
// validate argument
if (certificate == null)
throw new ArgumentNullException("Certificate is null");
}
}