Dela via


Tjänstidentitet och autentisering

En tjänsts slutpunktsidentitet är ett värde som genereras från tjänsten Web Services Description Language (WSDL). Det här värdet, som sprids till alla klienter, används för att autentisera tjänsten. När klienten har initierat en kommunikation till en slutpunkt och tjänsten autentiserar sig mot klienten jämför klienten slutpunktsidentitetsvärdet med det faktiska värdet som slutpunktsautentiseringsprocessen returnerade. Om de matchar är klienten säker på att den har kontaktat den förväntade tjänstslutpunkten. Detta fungerar som ett skydd mot nätfiske genom att förhindra att en klient omdirigeras till en slutpunkt som hanteras av en skadlig tjänst.

Ett exempelprogram som visar identitetsinställningen finns i Exempel på tjänstidentitet. Mer information om slutpunkter och slutpunktsadresser finns i Adresser.

Kommentar

När du använder NT LanMan (NTLM) för autentisering kontrolleras inte tjänstidentiteten eftersom klienten inte kan autentisera servern under NTLM. NTLM används när datorer ingår i en Windows-arbetsgrupp eller när du kör en äldre version av Windows som inte stöder Kerberos-autentisering.

När klienten initierar en säker kanal för att skicka ett meddelande till en tjänst via den autentiserar WCF-infrastrukturen (Windows Communication Foundation) tjänsten och skickar endast meddelandet om tjänstidentiteten matchar den identitet som anges i slutpunktsadressen som klienten använder.

Identitetsbearbetning består av följande steg:

  • Vid designtillfället bestämmer klientutvecklaren tjänstens identitet från slutpunktens metadata (exponeras via WSDL).

  • Vid körning kontrollerar klientprogrammet anspråken för tjänstens säkerhetsautentiseringsuppgifter innan de skickar meddelanden till tjänsten.

Identitetsbearbetning på klienten motsvarar klientautentisering på tjänsten. En säker tjänst kör inte kod förrän klientens autentiseringsuppgifter har autentiserats. På samma sätt skickar klienten inte meddelanden till tjänsten förrän tjänstens autentiseringsuppgifter har autentiserats baserat på vad som är känt i förväg från tjänstens metadata.

Egenskapen Identity för EndpointAddress klassen representerar identiteten för tjänsten som anropas av klienten. Tjänsten publicerar Identity i sina metadata. När klientutvecklaren kör ServiceModel Metadata Utility Tool (Svcutil.exe) mot tjänstslutpunkten innehåller den genererade konfigurationen värdet för tjänstens Identity egenskap. WCF-infrastrukturen (om den konfigureras med säkerhet) verifierar att tjänsten har den angivna identiteten.

Viktigt!

Metadata innehåller tjänstens förväntade identitet, så vi rekommenderar att du exponerar tjänstens metadata på ett säkert sätt, till exempel genom att skapa en HTTPS-slutpunkt för tjänsten. Mer information finns i Så här: Säkra metadataslutpunkter.

Identitetstyper

En tjänst kan tillhandahålla sex typer av identiteter. Varje identitetstyp motsvarar ett element som kan ingå i elementet <identity> i konfigurationen. Vilken typ som används beror på scenariot och tjänstens säkerhetskrav. I följande tabell beskrivs varje identitetstyp.

Identitetstyp beskrivning Normalt scenario
DNS (Domain Name System) Använd det här elementet med X.509-certifikat eller Windows-konton. Den jämför DNS-namnet som anges i autentiseringsuppgiften med det värde som anges i det här elementet. Med en DNS-kontroll kan du använda certifikat med DNS- eller ämnesnamn. Om ett certifikat återutfärdas med samma DNS- eller ämnesnamn är identitetskontrollen fortfarande giltig. När ett certifikat återutfärdas hämtar det en ny RSA-nyckel men behåller samma DNS- eller ämnesnamn. Det innebär att klienter inte behöver uppdatera sin identitetsinformation om tjänsten.
Intyg. Standardvärdet när ClientCredentialType är inställt på Certifikat. Det här elementet anger ett Base64-kodat X.509-certifikatvärde som ska jämföras med klienten.

Använd också det här elementet när du använder ett CardSpace som autentiseringsuppgifter för att autentisera tjänsten.
Det här elementet begränsar autentiseringen till ett enda certifikat baserat på dess tumavtrycksvärde. Detta möjliggör striktare autentisering eftersom tumavtrycksvärden är unika. Detta levereras med en varning: Om certifikatet återutfärdas med samma ämnesnamn har det också ett nytt tumavtryck. Därför kan klienter inte verifiera tjänsten om inte det nya tumavtrycket är känt. Mer information om hur du hittar ett certifikats tumavtryck finns i Så här hämtar du tumavtrycket för ett certifikat.
Certifikatreferens Identiskt med certifikatalternativet som beskrevs tidigare. Med det här elementet kan du dock ange ett certifikatnamn och en lagringsplats som certifikatet ska hämtas från. Samma som i certifikatscenariot som beskrevs tidigare.

Fördelen är att platsen för certifikatarkivet kan ändras.
RSA Det här elementet anger ett RSA-nyckelvärde som ska jämföras med klienten. Detta liknar certifikatalternativet, men i stället för att använda certifikatets tumavtryck används certifikatets RSA-nyckel i stället. Med en RSA-kontroll kan du specifikt begränsa autentiseringen till ett enda certifikat baserat på dess RSA-nyckel. Detta möjliggör striktare autentisering av en specifik RSA-nyckel på bekostnad av tjänsten, som inte längre fungerar med befintliga klienter om RSA-nyckelvärdet ändras.
Användarens huvudnamn (UPN). Standardvärdet när ClientCredentialType är inställt på Windows och tjänstprocessen inte körs under något av systemkontona. Det här elementet anger det UPN som tjänsten körs under. Se avsnittet Kerberos-protokoll och identitet i Åsidosätta identiteten för en tjänst för autentisering. Detta säkerställer att tjänsten körs under ett specifikt Windows-användarkonto. Användarkontot kan vara antingen den aktuella inloggade användaren eller tjänsten som körs under ett visst användarkonto.

Den här inställningen utnyttjar Windows Kerberos-säkerhet om tjänsten körs under ett domänkonto i en Active Directory-miljö.
Tjänstens huvudnamn (SPN). Standardvärdet när ClientCredentialType är inställt på Windows och tjänstprocessen körs under något av systemkontona– LocalService, LocalSystem eller NetworkService. Det här elementet anger det SPN som är associerat med tjänstens konto. Se avsnittet Kerberos-protokoll och identitet i Åsidosätta identiteten för en tjänst för autentisering. Detta säkerställer att SPN och det specifika Windows-konto som är associerat med SPN identifierar tjänsten.

Du kan använda verktyget Setspn.exe för att associera ett datorkonto för tjänstens användarkonto.

Den här inställningen utnyttjar Windows Kerberos-säkerhet om tjänsten körs under ett av systemkontona eller under ett domänkonto som har ett associerat SPN-namn med sig och datorn är medlem i en domän i en Active Directory-miljö.

Ange identitet i tjänsten

Vanligtvis behöver du inte ange identiteten för en tjänst eftersom valet av en klientautentiseringstyp avgör vilken typ av identitet som exponeras i tjänstens metadata. Mer information om hur du åsidosätter eller anger tjänstidentitet finns i Åsidosätta identiteten för en tjänst för autentisering.

Använda identitetselementet <> i konfigurationen

Om du ändrar klientautentiseringstypen i bindningen som tidigare visades till Certificateinnehåller den genererade WSDL ett Base64-serialiserat X.509-certifikat för identitetsvärdet enligt följande kod. Detta är standardvärdet för alla klientautentiseringstyper förutom Windows.

Du kan ändra värdet för standardtjänstidentiteten eller ändra identitetstypen med hjälp av -elementet <identity> i konfigurationen eller genom att ange identiteten i koden. Följande konfigurationskod anger en DNS-identitet (Domain Name System) med värdet contoso.com.

Ange identitet programmatiskt

Tjänsten behöver inte uttryckligen ange en identitet eftersom WCF automatiskt avgör den. Med WCF kan du dock ange en identitet på en slutpunkt om det behövs. Följande kod lägger till en ny tjänstslutpunkt med en specifik DNS-identitet.

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

Ange identitet på klienten

Vid designtillfället använder en klientutvecklare vanligtvis verktyget ServiceModel-metadataverktyg (Svcutil.exe) för att generera klientkonfiguration. Den genererade konfigurationsfilen (avsedd att användas av klienten) innehåller serverns identitet. Följande kod genereras till exempel från en tjänst som anger en DNS-identitet, som du ser i föregående exempel. Observera att klientens slutpunktsidentitetsvärde matchar tjänstens värde. I det här fallet, när klienten tar emot autentiseringsuppgifterna för Windows (Kerberos) för tjänsten, förväntar den sig att värdet är contoso.com.

Om tjänsten i stället för Windows anger ett certifikat som klientautentiseringstyp förväntas certifikatets DNS-egenskap vara värdet contoso.com. (Eller om DNS-egenskapen är nullmåste certifikatets ämnesnamn vara contoso.com.)

Använda ett specifikt värde för identitet

Följande klientkonfigurationsfil visar hur tjänstens identitet förväntas vara ett specifikt värde. I följande exempel kan klienten kommunicera med två slutpunkter. Den första identifieras med ett tumavtryck för certifikat och det andra med en certifikat-RSA-nyckel. Det vill: ett certifikat som endast innehåller ett offentligt nyckel-/privat nyckelpar, men som inte utfärdas av en betrodd utfärdare.

Identitetskontroll vid körning

Vid designtillfället bestämmer en klientutvecklare serverns identitet via dess metadata. Vid körning utförs identitetskontrollen innan du anropar några slutpunkter i tjänsten.

Identitetsvärdet är kopplat till den typ av autentisering som anges av metadata. med andra ord den typ av autentiseringsuppgifter som används för tjänsten.

Om kanalen är konfigurerad för att autentisera med hjälp av SSL (Secure Sockets Layer) på meddelande- eller transportnivå med X.509-certifikat för autentisering är följande identitetsvärden giltiga:

  • DNS. WCF ser till att certifikatet som tillhandahålls under SSL-handskakningen innehåller ett DNS- eller CommonName (CN)-attribut som är lika med det värde som anges i DNS-identiteten på klienten. Observera att dessa kontroller görs förutom att fastställa giltigheten för servercertifikatet. Som standard verifierar WCF att servercertifikatet utfärdas av en betrodd rotutfärdare.

  • Intyg. Under SSL-handskakningen ser WCF till att fjärrslutpunkten tillhandahåller det exakta certifikatvärdet som anges i identiteten.

  • Certifikatreferens. Samma som certifikat.

  • RSA. Under SSL-handskakningen ser WCF till att fjärrslutpunkten tillhandahåller den exakta RSA-nyckel som anges i identiteten.

Om tjänsten autentiserar med SSL på meddelande- eller transportnivå med en Windows-autentiseringsuppgift för autentisering och förhandlar om autentiseringsuppgifterna är följande identitetsvärden giltiga:

  • DNS. Förhandlingen skickar tjänstens SPN så att DNS-namnet kan kontrolleras. SPN är i formatet host/<dns name>.

  • SPN. En explicit tjänst-SPN returneras, till exempel host/myservice.

  • UPN. UPN för tjänstkontot. UPN är i formuläret username@domain. När tjänsten till exempel körs i ett användarkonto kan det vara username@contoso.com.

Det är valfritt att ange identiteten programmatiskt (med hjälp av Identity egenskapen). Om ingen identitet har angetts och klientens autentiseringstyp är Windows, är standardvärdet SPN med värdet inställt på värdnamnsdelen av tjänstslutpunktsadressen med prefixet "host/" literal. Om ingen identitet har angetts och klientens autentiseringstyp är ett certifikat är Certificatestandardvärdet . Detta gäller för både säkerhet på meddelande- och transportnivå.

Identitets- och anpassade bindningar

Eftersom identiteten för en tjänst är beroende av den bindningstyp som används kontrollerar du att en lämplig identitet exponeras när du skapar en anpassad bindning. I följande kodexempel är den exponerade identiteten till exempel inte kompatibel med säkerhetstypen eftersom identiteten för bootstrap-bindningen för säker konversation inte matchar identiteten för bindningen på slutpunkten. Bindningen för säker konversation anger DNS-identiteten, medan UPN- eller SPN-identiteten WindowsStreamSecurityBindingElement anges.

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())

Mer information om hur du staplar bindningselement korrekt för en anpassad bindning finns i Skapa användardefinierade bindningar. Mer information om hur du skapar en anpassad bindning med finns i SecurityBindingElementSå här skapar du ett SecurityBindingElement för ett angivet autentiseringsläge.

Se även