Я написал собственный сервис WCF, использующий WSHttpBindings, и пытаюсь реализовать безопасность на уровне сообщений, используя сгенерированные мной сертификаты. К сожалению, я получаю скрытое исключение (через средство просмотра трассировки служб), в котором говорится, что «предоставленные для пакета учетные данные не были распознаны».
Пара замечаний:
- Это должно быть сделано в коде, а не
в конфигурации
- (Сервер / Клиент) Сертификаты являются сертификатами
которые находятся в местном магазине машин
с доступными закрытыми ключами к моему
пользователь во время отладки.
- Я, черт возьми, гуглил это и
нашел хороший ресурс для настройки
Безопасность на основе сообщений WCF здесь
Я не уверен, что мне не хватает. Большая часть этого материала кажется простой, за исключением создания идентификаторов конечных точек. Не получается с тем же сообщением, использую ли я DnsEndpointIdentities, сертификаты на основе или нет идентификаторов вообще.
Кто-нибудь может указать мне правильное направление?
Сторона сервера:
var binding = new WSHttpBinding
{
Security =
{
Mode = SecurityMode.Message,
Message =
{
ClientCredentialType = MessageCredentialType.Certificate,
AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
}
}
};
_host = new ServiceHost(this)
{
Credentials =
{
ServiceCertificate =
{
Certificate = ServiceCert
},
ClientCertificate =
{
Certificate = ClientCert,
Authentication =
{
TrustedStoreLocation = StoreLocation.LocalMachine,
RevocationMode = X509RevocationMode.NoCheck,
CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
}
}
}
};
var address = new Uri(string.Format(@"http://serviceaddress"));
var ep = _host.AddServiceEndpoint(typeof (IService), binding, address);
ep.Address = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServiceCert));
_host.Open();
Клиентская сторона:
var binding = new WSHttpBinding
{
Security =
{
Mode = SecurityMode.Message,
Message =
{
ClientCredentialType = MessageCredentialType.Certificate,
AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
}
}
};
var address = new Uri(@"http://serviceaddress");
var endpoint = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServerCert));
var channelFactory = new ChannelFactory<IService>(binding, endpoint)
{
Credentials =
{
ServiceCertificate =
{
DefaultCertificate = ServerCert,
Authentication =
{
RevocationMode = X509RevocationMode.NoCheck,
TrustedStoreLocation = StoreLocation.LocalMachine,
CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
}
},
ClientCertificate =
{
Certificate = ClientCert
}
}
};
var channel = channelFactory.CreateChannel();