De identiteit van een service voor verificatie overschrijven
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. De volgende configuratiecode maakt bijvoorbeeld gebruik van het <wsHttpBinding-element> en stelt het clientCredentialType
kenmerk in op Windows.
In het volgende WSDL-fragment (Web Services Description Language) ziet u de identiteit voor het eerder gedefinieerde eindpunt. In dit voorbeeld wordt de service uitgevoerd als een zelf-hostende service onder een bepaald gebruikersaccount (username@contoso.com
) en daarom bevat de UPN-identiteit (User Principal Name) de accountnaam. De UPN wordt ook wel de aanmeldingsnaam van de gebruiker genoemd in een Windows-domein.
Zie Service Identity Sample voor een voorbeeldtoepassing waarin de identiteitsinstelling wordt gedemonstreert. Zie Service-identiteit en -verificatie voor meer informatie over service-identiteiten.
Kerberos-verificatie en -identiteit
Wanneer een service is geconfigureerd voor het gebruik van een Windows-referentie, wordt standaard een identiteitselement> met een <userPrincipalName>- of <servicePrincipalName-element> gegenereerd in de WSDL.< Als de service wordt uitgevoerd onder het , of account, wordt standaard een SPN (Service Principal Name) gegenereerd in de vorm van hostnaam> omdat deze accounts toegang hebben tot de SPN-gegevens van host/
<de computer.NetworkService
LocalService
LocalSystem
Als de service wordt uitgevoerd onder een ander account, genereert Windows Communication Foundation (WCF) een UPN in de vorm van <gebruikersnaam>@<domeinnaam>
. Dit gebeurt omdat kerberos-verificatie vereist dat een UPN of SPN wordt opgegeven aan de client om de service te verifiëren.
U kunt ook het hulpprogramma Setspn gebruiken om een extra SPN te registreren bij het account van een service in een domein. Vervolgens kunt u de SPN gebruiken als de identiteit van de service. Zie Overzicht van Setspn voor meer informatie over het hulpprogramma.
Notitie
Als u het Windows-referentietype zonder onderhandeling wilt gebruiken, moet het gebruikersaccount van de service toegang hebben tot de SPN die is geregistreerd bij het Active Directory-domein. U kunt dit op de volgende manieren doen:
Gebruik het NetworkService- of LocalSystem-account om uw service uit te voeren. Omdat deze accounts toegang hebben tot de computer-SPN die tot stand is gebracht wanneer de computer lid wordt van het Active Directory-domein, genereert WCF automatisch het juiste SPN-element binnen het eindpunt van de service in de metagegevens van de service (WSDL).
Gebruik een willekeurig Active Directory-domeinaccount om uw service uit te voeren. In dit geval maakt u een SPN voor dat domeinaccount, dat u kunt doen met behulp van het hulpprogramma Setspn.exe hulpprogramma. Zodra u de SPN voor het account van de service hebt gemaakt, configureert u WCF om deze SPN te publiceren naar de clients van de service via de metagegevens (WSDL). Dit wordt gedaan door de eindpuntidentiteit in te stellen voor het weergegeven eindpunt, hetzij via een toepassingsconfiguratiebestand of -code.
Zie Kerberos Technical Supplement voor Windows voor meer informatie over SPN's, het Kerberos-protocol en Active Directory.
Wanneer SPN of UPN gelijk is aan de lege tekenreeks
Als u de SPN of UPN instelt die gelijk is aan een lege tekenreeks, gebeurt er een aantal verschillende dingen, afhankelijk van het beveiligingsniveau en de verificatiemodus die wordt gebruikt:
Als u transportniveaubeveiliging gebruikt, wordt NT LanMan-verificatie (NTLM) gekozen.
Als u beveiliging op berichtniveau gebruikt, kan verificatie mislukken, afhankelijk van de verificatiemodus:
Als u de modus gebruikt
spnego
en het kenmerk is ingesteld opfalse
, mislukt deAllowNtlm
verificatie.Als u de modus gebruikt
spnego
en het kenmerk is ingesteld optrue
, mislukt deAllowNtlm
verificatie als de UPN leeg is, maar slaagt als de SPN leeg is.Als u Kerberos direct (ook wel 'één shot' genoemd) gebruikt, mislukt de verificatie.
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