Service-identiteit en -verificatie
De eindpuntidentiteit van een service is een waarde die wordt gegenereerd op basis van de Service Web Services Description Language (WSDL). Deze waarde, doorgegeven aan elke client, wordt gebruikt om de service te verifiëren. Nadat de client een communicatie met een eindpunt initieert en de service zichzelf verifieert bij de client, vergelijkt de client de eindpuntidentiteitswaarde met de werkelijke waarde die het eindpuntverificatieproces heeft geretourneerd. Als deze overeenkomen, weet de client zeker dat er contact is opgenomen met het verwachte service-eindpunt. Dit fungeert als een bescherming tegen phishing door te voorkomen dat een client wordt omgeleid naar een eindpunt dat wordt gehost door een schadelijke service.
Zie Service Identity Sample voor een voorbeeldtoepassing waarin de identiteitsinstelling wordt gedemonstreert. Zie Adressen voor meer informatie over eindpunten en eindpuntadressen.
Notitie
Wanneer u NT LanMan (NTLM) gebruikt voor verificatie, wordt de service-identiteit niet gecontroleerd omdat de client onder NTLM de server niet kan verifiëren. NTLM wordt gebruikt wanneer computers deel uitmaken van een Windows-werkgroep of wanneer een oudere versie van Windows wordt uitgevoerd die Kerberos-verificatie niet ondersteunt.
Wanneer de client een beveiligd kanaal initieert voor het verzenden van een bericht naar een service, verifieert de WCF-infrastructuur (Windows Communication Foundation) de service en verzendt het bericht alleen als de service-id overeenkomt met de identiteit die is opgegeven in het eindpuntadres dat de client gebruikt.
Identiteitsverwerking bestaat uit de volgende fasen:
Tijdens het ontwerp bepaalt de clientontwikkelaar de identiteit van de service op basis van de metagegevens van het eindpunt (beschikbaar gesteld via WSDL).
Tijdens runtime controleert de clienttoepassing de claims van de beveiligingsreferenties van de service voordat ze berichten naar de service verzenden.
Identiteitsverwerking op de client is vergelijkbaar met clientverificatie op de service. Een beveiligde service voert pas code uit als de referenties van de client zijn geverifieerd. Op dezelfde manier verzendt de client geen berichten naar de service totdat de referenties van de service zijn geverifieerd op basis van wat van tevoren bekend is van de metagegevens van de service.
De Identity eigenschap van de EndpointAddress klasse vertegenwoordigt de identiteit van de service die door de client wordt aangeroepen. De service publiceert de Identity in de metagegevens. Wanneer de clientontwikkelaar het hulpprogramma servicemodelmetagegevenshulpprogramma (Svcutil.exe) uitvoert op basis van het service-eindpunt, bevat de gegenereerde configuratie de waarde van de eigenschap van de service Identity . De WCF-infrastructuur (indien geconfigureerd met beveiliging) controleert of de service de opgegeven identiteit bezit.
Belangrijk
De metagegevens bevatten de verwachte identiteit van de service, dus het wordt aanbevolen dat u de metagegevens van de service beschikbaar maakt via beveiligde middelen, bijvoorbeeld door een HTTPS-eindpunt voor de service te maken. Zie How to: Secure Metadata Endpoints (Eindpunten voor beveiligde metagegevens) voor meer informatie.
Identiteitstypen
Een service kan zes typen identiteiten bieden. Elk identiteitstype komt overeen met een element dat kan worden opgenomen in het <identity>
element in de configuratie. Het gebruikte type is afhankelijk van het scenario en de beveiligingsvereisten van de service. In de volgende tabel wordt elk identiteitstype beschreven.
Identiteitstype | Beschrijving | Typisch scenario |
---|---|---|
Domain Name System (DNS) | Gebruik dit element met X.509-certificaten of Windows-accounts. De DNS-naam die in de referentie is opgegeven, wordt vergeleken met de waarde die in dit element is opgegeven. | Met een DNS-controle kunt u certificaten gebruiken met DNS- of onderwerpnamen. Als een certificaat opnieuw wordt uitgegeven met dezelfde DNS- of onderwerpnaam, is de identiteitscontrole nog steeds geldig. Wanneer een certificaat opnieuw wordt uitgegeven, krijgt het een nieuwe RSA-sleutel, maar blijft dezelfde DNS- of onderwerpnaam behouden. Dit betekent dat clients hun identiteitsgegevens over de service niet hoeven bij te werken. |
Certificaat. De standaardinstelling wanneer ClientCredentialType deze is ingesteld op Certificaat. |
Dit element geeft een X.509-certificaatwaarde met Base64-codering op die moet worden vergeleken met de client. Gebruik dit element ook wanneer u een CardSpace als referentie gebruikt om de service te verifiëren. |
Dit element beperkt de verificatie tot één certificaat op basis van de vingerafdrukwaarde. Dit maakt strengere verificatie mogelijk omdat vingerafdrukwaarden uniek zijn. Dit wordt geleverd met één voorbehoud: als het certificaat opnieuw wordt uitgegeven met dezelfde onderwerpnaam, heeft het ook een nieuwe vingerafdruk. Clients kunnen daarom de service niet valideren, tenzij de nieuwe vingerafdruk bekend is. Zie De vingerafdruk van een certificaat ophalen voor meer informatie over het vinden van de vingerafdruk van een certificaat. |
Certificaatreferentie | Identiek aan de optie Certificaat die eerder is beschreven. Met dit element kunt u echter een certificaatnaam opgeven en de locatie opslaan waaruit het certificaat moet worden opgehaald. | Hetzelfde als het certificaatscenario dat eerder is beschreven. Het voordeel is dat de locatie van het certificaatarchief kan worden gewijzigd. |
RSA | Dit element geeft een RSA-sleutelwaarde op die moet worden vergeleken met de client. Dit is vergelijkbaar met de certificaatoptie, maar in plaats van de vingerafdruk van het certificaat te gebruiken, wordt de RSA-sleutel van het certificaat gebruikt. | Met een RSA-controle kunt u de verificatie specifiek beperken tot één certificaat op basis van de RSA-sleutel. Dit maakt strengere verificatie mogelijk van een specifieke RSA-sleutel ten koste van de service, die niet langer werkt met bestaande clients als de RSA-sleutelwaarde verandert. |
User Principal Name (UPN). De standaardinstelling wanneer de ClientCredentialType optie is ingesteld op Windows en het serviceproces niet wordt uitgevoerd onder een van de systeemaccounts. |
Dit element geeft de UPN op waaronder de service wordt uitgevoerd. Zie de sectie Kerberos Protocol en Identiteit van het overschrijven van de identiteit van een service voor verificatie. | Dit zorgt ervoor dat de service wordt uitgevoerd onder een specifiek Windows-gebruikersaccount. Het gebruikersaccount kan de huidige aangemelde gebruiker zijn of de service die wordt uitgevoerd onder een bepaald gebruikersaccount. Deze instelling maakt gebruik van Windows Kerberos-beveiliging als de service wordt uitgevoerd onder een domeinaccount in een Active Directory-omgeving. |
SpN (Service Principal Name). De standaardinstelling wanneer het ClientCredentialType is ingesteld op Windows en het serviceproces wordt uitgevoerd onder een van de systeemaccounts: LocalService, LocalSystem of NetworkService. |
Met dit element geeft u de SPN op die is gekoppeld aan het account van de service. Zie de sectie Kerberos Protocol en Identiteit van het overschrijven van de identiteit van een service voor verificatie. | Dit zorgt ervoor dat de SPN en het specifieke Windows-account dat is gekoppeld aan de SPN de service identificeren. U kunt het hulpprogramma Setspn.exe gebruiken om een computeraccount te koppelen voor het gebruikersaccount van de service. Deze instelling maakt gebruik van windows Kerberos-beveiliging als de service wordt uitgevoerd onder een van de systeemaccounts of onder een domeinaccount met een gekoppelde SPN-naam en de computer lid is van een domein in een Active Directory-omgeving. |
Identiteit opgeven bij de service
Normaal gesproken hoeft u de identiteit niet in te stellen voor een service, omdat de selectie van een clientreferentietype het type identiteit bepaalt dat wordt weergegeven in de metagegevens van de service. Zie De identiteit van een service voor verificatie overschrijven of opgeven voor meer informatie over het overschrijven of opgeven van een service-id.
<Het identiteitselement> in configuratie gebruiken
Als u het clientreferentietype wijzigt in de binding die eerder werd weergegeven Certificate
, bevat de gegenereerde WSDL een X.509-certificaat dat is geserialiseerd met Base64 voor de identiteitswaarde, zoals wordt weergegeven in de volgende code. Dit is de standaardinstelling voor alle andere typen clientreferenties dan Windows.
U kunt de waarde van de standaardservice-identiteit wijzigen of het type identiteit wijzigen met behulp van het <identity>
element in de configuratie of door de identiteit in code in te stellen. Met de volgende configuratiecode wordt een DNS-identiteit (Domain Name System) ingesteld met de waarde contoso.com
.
Identiteit programmatisch instellen
Uw service hoeft geen identiteit expliciet op te geven, omdat WCF deze automatisch bepaalt. Met WCF kunt u echter, indien nodig, een identiteit opgeven op een eindpunt. Met de volgende code wordt een nieuw service-eindpunt met een specifieke DNS-identiteit toegevoegd.
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
Identiteit opgeven bij de client
Bij het ontwerpen gebruikt een clientontwikkelaar doorgaans het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe) om clientconfiguratie te genereren. Het gegenereerde configuratiebestand (bedoeld voor gebruik door de client) bevat de identiteit van de server. De volgende code wordt bijvoorbeeld gegenereerd op basis van een service die een DNS-identiteit opgeeft, zoals wordt weergegeven in het voorgaande voorbeeld. Houd er rekening mee dat de eindpuntidentiteitswaarde van de client overeenkomt met die van de service. In dit geval verwacht de client dat de Windows-referenties (Kerberos) voor de service worden contoso.com
ontvangen.
Als de service in plaats van Windows een certificaat opgeeft als het clientreferentietype, wordt verwacht dat de DNS-eigenschap van het certificaat de waarde contoso.com
is. (Of als de DNS-eigenschap is null
, moet contoso.com
de onderwerpnaam van het certificaat .)
Een specifieke waarde voor identiteit gebruiken
In het volgende clientconfiguratiebestand ziet u hoe de identiteit van de service naar verwachting een specifieke waarde is. In het volgende voorbeeld kan de client communiceren met twee eindpunten. De eerste wordt geïdentificeerd met een vingerafdruk van een certificaat en de tweede met een RSA-certificaatsleutel. Dat wil gezegd: een certificaat dat alleen een openbaar sleutel-/persoonlijk sleutelpaar bevat, maar niet wordt uitgegeven door een vertrouwde instantie.
Identiteitscontrole tijdens runtime
Tijdens het ontwerp bepaalt een clientontwikkelaar de identiteit van de server via de metagegevens. Tijdens runtime wordt de identiteitscontrole uitgevoerd voordat er eindpunten in de service worden aangeroepen.
De identiteitswaarde is gekoppeld aan het type verificatie dat is opgegeven door metagegevens; met andere woorden, het type referenties dat wordt gebruikt voor de service.
Als het kanaal is geconfigureerd voor verificatie met behulp van berichten- of transportniveau Secure Sockets Layer (SSL) met X.509-certificaten voor verificatie, zijn de volgende identiteitswaarden geldig:
DNS. WCF zorgt ervoor dat het certificaat dat is opgegeven tijdens de SSL-handshake een DNS- of
CommonName
CN-kenmerk bevat dat gelijk is aan de waarde die is opgegeven in de DNS-identiteit op de client. Houd er rekening mee dat deze controles worden uitgevoerd naast het bepalen van de geldigheid van het servercertificaat. WCF valideert standaard of het servercertificaat wordt uitgegeven door een vertrouwde basisinstantie.Certificaat. Tijdens de SSL-handshake zorgt WCF ervoor dat het externe eindpunt de exacte certificaatwaarde levert die is opgegeven in de identiteit.
Certificaatreferentie. Hetzelfde als het certificaat.
RSA. Tijdens de SSL-handshake zorgt WCF ervoor dat het externe eindpunt de exacte RSA-sleutel levert die is opgegeven in de identiteit.
Als de service wordt geverifieerd met behulp van SSL op bericht- of transportniveau met een Windows-referentie voor verificatie en de referentie onderhandelt, zijn de volgende identiteitswaarden geldig:
DNS. De onderhandeling geeft de SPN van de service door, zodat de DNS-naam kan worden gecontroleerd. De SPN heeft de vorm
host/<dns name>
.SPN. Er wordt bijvoorbeeld
host/myservice
een expliciete service-SPN geretourneerd.UPN. De UPN van het serviceaccount. De UPN heeft de vorm
username
@domain
. Wanneer de service bijvoorbeeld wordt uitgevoerd in een gebruikersaccount, kan dit zijnusername@contoso.com
.
Het programmatisch opgeven van de identiteit (met behulp van de Identity eigenschap) is optioneel. Als er geen identiteit is opgegeven en het clientreferentietype Windows is, is de standaard-SPN met de waarde ingesteld op het hostnaamgedeelte van het adres van het service-eindpunt, voorafgegaan door de letterlijke waarde 'host/'. Als er geen identiteit is opgegeven en het clientreferentietype een certificaat is, is de standaardwaarde Certificate
. Dit geldt voor zowel bericht- als transportniveaubeveiliging.
Identiteit en aangepaste bindingen
Omdat de identiteit van een service afhankelijk is van het gebruikte bindingstype, moet u ervoor zorgen dat een geschikte identiteit wordt weergegeven bij het maken van een aangepaste binding. In het volgende codevoorbeeld is de weergegeven identiteit bijvoorbeeld niet compatibel met het beveiligingstype, omdat de identiteit voor de beveiligde gespreksbootbinding niet overeenkomt met de identiteit voor de binding op het eindpunt. De beveiligde gespreksbinding stelt de DNS-identiteit in, terwijl de WindowsStreamSecurityBindingElement UPN- of SPN-identiteit wordt ingesteld.
CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
CreateSecureConversationBindingElement(
SecurityBindingElement.
CreateIssuedTokenForSslBindingElement(
new IssuedSecurityTokenParameters())));
// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());
Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))
' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())
Zie Door de gebruiker gedefinieerde bindingen maken voor meer informatie over het correct stapelen van bindingselementen voor een aangepaste binding. Zie How to: Create a SecurityBindingElement for a Specified Authentication Mode (Een SecurityBindingElement maken voor een opgegeven verificatiemodus) voor meer informatie over het maken van een aangepaste binding met de SecurityBindingElement
Zie ook
- Procedure: Een aangepaste binding maken met behulp van securityBindingElement
- Procedure: Een SecurityBindingElement maken voor een opgegeven verificatiemodus
- Procedure: Een aangepaste clientidentiteitsverificator maken
- Een referentietype selecteren
- Werken met certificaten
- Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe)
- Door de gebruiker gedefinieerde bindingen maken
- Procedure: De vingerafdruk van een certificaat ophalen