Проблема безопасности WCF
-
19-08-2019 - |
Вопрос
Немного предыстории: для обеспечения аутентификации я использую сертификаты на стороне клиента и сервера (WCF) и использую один сертификат для всех клиентов (загрузка его из каталога приложения вручную - не самый безопасный способ, но не требует управления хранением и созданием сертификатов). установка сложнее):
AddressHeader hostHdr = AddressHeader.CreateAddressHeader(ServiceFactory.CLIENT_HOST_HEADER, ServiceFactory.NAMESPACE, hostName);
builder.Headers.Add(hostHdr);
builder.Identity = new X509CertificateEndpointIdentity(GetServiceCertificate(name));
_factory = new ChannelFactory<T>(name, builder.ToEndpointAddress());
_factory.Credentials.ClientCertificate.Certificate = GetClientCertificate(name);
X509ServiceCertificateAuthentication auth = _factory.Credentials.ServiceCertificate.Authentication;
auth.CertificateValidationMode =X509CertificateValidationMode.Custom;
auth.CustomCertificateValidator = new CustomCertificateValidator(new[] {GetServiceCertificate(name)});
Это сторона клиента, а настройка хоста на стороне сервера выглядит следующим образом:
private void CertificateSetup(ServiceHost host)
{
if (ServiceCertificate != null)
host.Credentials.ServiceCertificate.Certificate = ServiceCertificate;
X509ClientCertificateAuthentication authentication =
host.Credentials.ClientCertificate.Authentication;
authentication.CertificateValidationMode =
X509CertificateValidationMode.Custom;
authentication.CustomCertificateValidator =
new CustomCertificateValidator(new [] {ClientCertificate});
}
Это отлично работает и позволяет подписывать сообщения, но режим безопасности устанавливается следующим образом:
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
Но мне нужно
string name = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
как-то получить WindowsIdentity в ServiceSecurityContext. Режим безопасности смешанного (транспорта и сообщения) не полезен, потому что я не знаю почему, но даже если я установил Windows clientCredentials в конфигурации для инфраструктуры режима транспорта, попытка установить соединение SSL.
Есть идеи ???? Р> <Ч>
Сертификаты используются для подписи сообщений, т.е. доказательство того, что другая сторона является либо реальным клиентом, либо службой (человек посередине). Но авторизация в разрабатываемой системе частично зависит от WindowsIdentity в ServiceSecurityContect. Все, что я хочу - включить WindowsIdentity в sec.context, а PrimaryIdentity - это X509CertIdentity. Поэтому мне нужно знать на стороне сервера, какой пользователь домена запрашивал работу службы. Р>
Решение
Попробуйте эту ссылку re: Олицетворение:
http://msdn.microsoft.com/en-us/library /ms730088.aspx р>
раздел - " сопоставление сертификата клиента с учетной записью Windows " похоже на то, что вам нужно.
с настройкой на клиенте:
authentication mapClientCertificateToWindowsAccount="true"
Код клиента:
'Создайте привязку, которая устанавливает сертификат в качестве типа учетных данных клиента.
Dim b As WSHttpBinding = New WSHttpBinding()
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
'Создайте хост службы, который сопоставляет сертификат с учетной записью Windows.
Dim httpUri As Uri = New Uri("http://localhost/Calculator")
Dim sh As ServiceHost = New ServiceHost(GetType(HelloService), httpUri)
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = True
Надеюсь, это поможет
Другие советы
Если вы используете защиту сообщений с сертификатами на каждом конце, обеспечивающими ее защиту, я не совсем уверен, зачем вам нужна идентификация Windows? В чем причина этого? Р>
Может быть, эта ссылка будет полезна - разделы 6 & amp; 7 содержат подробную информацию о настройках конфигурации для аутентификации сертификата, которая работает аналогично SSL: