problema de segurança WCF
-
19-08-2019 - |
Pergunta
Alguns antecedentes: a fim de fornecer autenticação Estou usando certificados de cliente e do lado do servidor (WCF) e usar um certificado para todos os clientes (carregá-lo manualmente a partir do directório de aplicações - não a maneira mais segura, mas não necessita de gerir o armazenamento de certificados e tomada instalação mais difícil):
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)});
Esta é do lado do cliente, ea criação de olhares como este alojamento serverside:
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});
}
Isso funciona bem e permite a assinar mensagens, mas, tanto quanto set modo de segurança no seguinte forma:
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
Mas eu preciso
string name = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
de alguma forma obter WindowsIdentity em ServiceSecurityContext. modo de segurança Misto (Transportes e Mensagem) não é útil, porque eu não sei porquê, mas mesmo se eu definir ClientCredentials do Windows na configuração para transporte tentativas de infra-estrutura modo de parte para estabelecer a conexão SSL.
Todas as idéias ????
Os certificados são usados ??para assinatura de mensagens, i. provando que outro lado é ou verdadeiro cliente ou serviço (man-in-the-middle). Mas autorização no sistema que está sendo desenvolvido parcialmente depende WindowsIdentity em ServiceSecurityContect. Tudo que eu quero-incluem WindowsIdentity em sec.context, entretanto PrimaryIdentity é X509CertIdentity. Então eu preciso saber sobre serverside que usuário de domínio solicitado operação de serviço.
Solução
Tente este link re: Representação:
http://msdn.microsoft.com/en-us/library /ms730088.aspx
seção sobre -. "Mapeando um certificado de cliente para uma conta do Windows", parece que você está depois
com configuração no cliente:
authentication mapClientCertificateToWindowsAccount="true"
O código do cliente:
' Criar uma ligação que define um certificado como o tipo de credencial do cliente.
Dim b As WSHttpBinding = New WSHttpBinding()
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
' Criar um host de serviço que mapeia o certificado para uma conta do 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
Espero que ajude
Outras dicas
Se você estiver usando segurança de mensagens com certificados em cada extremidade prendendo-o, eu não estou muito certo porque você precisaria de uma identidade do Windows? Qual é o raciocínio por trás disso?
Talvez este link vai ser de uso - seções 6 e 7 tem detalhes sobre as definições de configuração para authentiaction certificado, que funciona de forma semelhante ao SSL: