2016-04-28 2 views
0

Ich habe ein Problem mit der Windows Azure ACS, und ich kann nicht ganz feststellen, ob es so sein soll oder ob ein Fehler in meinem Code vorliegt.Aufruf der vertrauenden Partei über HTTPS und Token-Verschlüsselung

Ich habe eine Reihe von vertrauenden Parteien in der ACS konfiguriert und alle von ihnen sind mit HTTPS konfiguriert. Jeder Dienst ist so konfiguriert, dass die Token-Verschlüsselung erforderlich ist. Dazu habe ich ein mit MakeCert.exe erstelltes Zertifikat hochgeladen.

Wenn der Kunde mit der vertrauenden Partei in Verbindung steht, ich fügen Sie den öffentlichen Teil des Zertifikats als Service-Zertifikat und ich füge hinzu, das Thema Namen als DnsIdentity:

var identity = EndpointIdentity.CreateDnsIdentity(GetClientCertificateSubjectName()); 
var serviceEndpointAddress = new EndpointAddress(new Uri(_serviceAddress), identity); 

// Creation of channel factory 

if(channelFactory.Credentials != null) { 
    channelFactory.Credentials.ServiceCertificate.DefaultCertificate = GetClientCertificate(); 
    channelFactory.Credentials.ClientCertificate.Certificate = GetServiceIdentityCertificate(); 
} 

Hier ist das Ding: wenn ich den Anruf vertrauende Partei über HTTPS, dann kann ich die Erstellung der EndpointIdentity überspringen und dann die vertrauende Partei wird mir eine richtige Antwort geben. Ich kann auch überspringen die Einstellung der ServiceCertificate.DefaultCertificate Eigenschaft oder setzen Sie eine völlig zufällige Zertifikat, und die vertrauende Partei wird mir immer noch eine richtige Antwort geben.

Beim Aufruf von HTTP führt das Ausführen einer der oben genannten Aktionen dazu, dass der ACS mit Meldungen ausfällt, die angeben, dass ich die richtigen Zertifikate nicht verwendet habe. Kurz gesagt: Beim Aufruf über HTTP kann ich nur mit dem richtigen Client-Zertifikat kommunizieren. Ich habe erwartet, dass dies auch für HTTPS der Fall ist.

Ich kann mir vorstellen, dass die ChannelFactory<T> oder die ACS intelligent genug ist zu erkennen, dass HTTPS verwendet wird und dass die konfigurierte Verschlüsselung zugunsten der SSL-Verschlüsselung übersprungen wird. Leider kann ich keine Dokumentation finden, die diese Idee unterstützt.

Meine Frage ist: Ist es normal, die EndpointIdentity und Zertifikate beim Aufruf einer vertrauenden Partei über HTTPS zu ignorieren? Oder benötige ich zusätzliche Konfiguration, um das zu funktionieren?

Vielen Dank im Voraus!

Antwort

0

Die Menge der Informationen, die ich gab, entpuppte sich als nicht ausreichend, um die Frage richtig zu beantworten. Es stellte sich heraus, dass alles in den Bindungen lag, die wir kreierten. Es schafft mit dem folgenden Codeabschnitt eine Bindung:

public static Binding CreateServiceBinding(string acsCertificateEndpoint, string bindingNameSpace, bool useSsl) { 
    var binding = new IssuedTokenWSTrustBinding(CreateAcsCertificateBinding(), new EndpointAddress(acsCertificateEndpoint)); 

    if(useSsl) { 
    binding.SecurityMode = SecurityMode.TransportWithMessageCredential; 
    } 

    if(!string.IsNullOrWhiteSpace(bindingNameSpace)) { 
    binding.Namespace = bindingNameSpace; 
    } 

    return binding; 
} 

public static CertificateWSTrustBinding CreateAcsCertificateBinding() { 
    return new CertificateWSTrustBinding(SecurityMode.TransportWithMessageCredential); 
} 

, die in die folgenden Ergebnisse:

  1. Wenn es sich um HTTP-Kommunikation, es geht durch die Strömungs MutualCertificate Authentifizierungsmodus, und es wird auf die Nachricht angewendet nur Schicht. Aus diesem Grund ist der Kunde verpflichtet, ein Kundenzertifikat vorzulegen. Dieses Bindungselement erstellt ein asymmetrisches Sicherheitsbindungselement, das so konfiguriert ist, dass eine zertifikatbasierte Clientauthentifizierung sowie eine zertifikatbasierte Serverauthentifizierung erforderlich sind.
  2. Wenn es sich um https-Kommunikation handelt, wird der Authentifizierungsmodus-Ablauf von CertificateOverTransport durchlaufen und nur auf der Transportschicht angewendet. Aus diesem Grund funktioniert das Client-Zertifikat zwar nicht, aber es funktioniert. Dieses Bindungselement erwartet, dass der Transport Server-Authentifizierung sowie Nachrichtenschutz (z. B. HTTPS) bereitstellt.

Weitere Informationen zu den Sicherheitsmodi, überprüfen Sie die folgenden Links aus:

https://msdn.microsoft.com/en-us/library/ms733098%28v=vs.110%29.aspx https://msdn.microsoft.com/en-us/library/ms731074%28v=vs.110%29.aspx

hoffe, das hilft jemand!