Dela via


Åsidosätta identiteten för en tjänst för autentisering

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. Följande konfigurationskod använder till exempel elementet <wsHttpBinding> och anger clientCredentialType attributet till Windows.

Följande WSDL-fragment (Web Services Description Language) visar identiteten för den slutpunkt som tidigare definierats. I det här exemplet körs tjänsten som en lokalt installerad tjänst under ett visst användarkonto (username@contoso.com) och därför innehåller UPN-identiteten (user principal name) kontonamnet. UPN kallas även för användarens inloggningsnamn i en Windows-domän.

Ett exempelprogram som visar identitetsinställningen finns i Exempel på tjänstidentitet. Mer information om tjänstidentitet finns i Tjänstidentitet och autentisering.

Kerberos-autentisering och identitet

När en tjänst är konfigurerad att använda en Windows-autentiseringsuppgift genereras som standard ett <identitetselement> som innehåller ett <userPrincipalName-> eller< servicePrincipalName-element> i WSDL. Om tjänsten körs under LocalSystemkontot , LocalServiceeller NetworkService genereras som standard ett tjänsthuvudnamn (SPN) i form av host/<värdnamn> eftersom dessa konton har åtkomst till datorns SPN-data. Om tjänsten körs under ett annat konto genererar Windows Communication Foundation (WCF) ett UPN i form av <username>@<domainName.> Detta beror på att Kerberos-autentisering kräver att ett UPN eller SPN skickas till klienten för att autentisera tjänsten.

Du kan också använda setspn-verktyget för att registrera ytterligare ett SPN med en tjänsts konto i en domän. Du kan sedan använda SPN som identitet för tjänsten. Mer information om verktyget finns i Översikt över Setspn.

Kommentar

Om du vill använda Windows-autentiseringstypen utan förhandling måste tjänstens användarkonto ha åtkomst till det SPN som är registrerat med Active Directory-domänen. Du kan göra detta på följande sätt:

  • Använd kontot NetworkService eller LocalSystem för att köra tjänsten. Eftersom dessa konton har åtkomst till datorns SPN som upprättas när datorn ansluter till Active Directory-domänen genererar WCF automatiskt rätt SPN-element i tjänstens slutpunkt i tjänstens metadata (WSDL).

  • Använd ett godtyckligt Active Directory-domänkonto för att köra tjänsten. I det här fallet upprättar du ett SPN för det domänkontot, vilket du kan göra med hjälp av verktyget Setspn.exe verktyg. När du har skapat SPN för tjänstens konto konfigurerar du WCF för att publicera det SPN till tjänstens klienter via dess metadata (WSDL). Detta görs genom att ange slutpunktsidentiteten för den exponerade slutpunkten, antingen via en programkonfigurationsfil eller kod.

Mer information om SPN, Kerberos-protokollet och Active Directory finns i Kerberos Tekniska tillägg för Windows.

När SPN eller UPN är lika med den tomma strängen

Om du ställer in SPN eller UPN lika med en tom sträng sker ett antal olika saker, beroende på vilken säkerhetsnivå och autentiseringsläge som används:

  • Om du använder säkerhet på transportnivå väljs NT LanMan-autentisering (NTLM).

  • Om du använder säkerhet på meddelandenivå kan autentiseringen misslyckas, beroende på autentiseringsläget:

  • Om du använder spnego läget och attributet är inställt på falsemisslyckas autentiseringenAllowNtlm.

  • Om du använder spnego läge och AllowNtlm attributet är inställt på truemisslyckas autentiseringen om UPN är tomt men lyckas om SPN är tomt.

  • Om du använder Kerberos-direkt (kallas även "one-shot") misslyckas autentiseringen.

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

Se även