WCF Sicherheitsproblem
-
19-08-2019 - |
Frage
Einige Hintergrundinformationen: um die Authentifizierung zu schaffen, ich bin für alle Clients Zertifikate auf Client- und Serverseite (WCF) und verwenden ein Zertifikat (manuell von Anwendungsverzeichnis geladen - nicht der sicherste Weg, aber es erfordert keine Zertifikatspeicher zu verwalten und zu machen Installation schwieriger):
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)});
Dies ist Client-Seite, und serverseitige Host sieht wie folgt einrichten:
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});
}
Das funktioniert gut und erlaubt es, Nachrichten zu unterschreiben, aber soweit Sicherheitsmodus in folgenden Weise festgelegt:
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
Aber ich brauche
string name = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
irgendwie Windows in ServiceSecurityContext zu erhalten. Mixed (Transport- und Nachrichten) Sicherheitsmodus ist nicht hilfreich, weil ich weiß nicht warum, aber selbst wenn ich Windows ClientCredentials für Transport Teilmodus Infrastruktur in Config gesetzt versucht SSL-Verbindung aufzubauen.
Alle Ideen ????
Die Zertifikate werden für Nachrichtensignierung verwendet, d.h. was beweist, dass andere Seite entweder real Client oder Dienst (man-in-the-middle) ist. Aber Zulassung in System teilweise verlässt sich in ServiceSecurityContect auf Windows entwickelt. Alles, was ich Windows in sec.context-wollen gehören mittlerweile PrimaryIdentity ist X509CertIdentity. Also muss ich auf server wissen, welche Domain-Benutzer-Service-Operation angefordert.
Lösung
Versuchen Sie diesen Link re: Identitätswechsel:
http://msdn.microsoft.com/en-us/library /ms730088.aspx
Abschnitt - „Zuordnen eines Client-Zertifikat auf einem Windows-Konto“, scheint, wie, was Sie nach
.mit Config auf Client:
authentication mapClientCertificateToWindowsAccount="true"
Client-Code:
‘Erstellen Sie eine Bindung, die ein Zertifikat als Client Legitimierungsart setzt.
Dim b As WSHttpBinding = New WSHttpBinding()
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
‘Erstellen Sie einen Service-Host, der das Zertifikat auf einem Windows-Konto zugeordnet ist.
Dim httpUri As Uri = New Uri("http://localhost/Calculator")
Dim sh As ServiceHost = New ServiceHost(GetType(HelloService), httpUri)
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = True
Ich hoffe, das hilft
Andere Tipps
Wenn Sie mit Nachrichtensicherheit mit Zertifikaten an jedem Ende es zu sichern, ich bin mir nicht ganz sicher, warum Sie eine Windows-Identität benötigen würden? Was ist die Begründung dahinter?
Vielleicht wird dieser Link von Nutzen sein - Abschnitte 6 und 7 haben Details von Konfigurationseinstellungen für Zertifikat authentiaction, die ähnlich wie SSL funktionieren: