Tokenprovider
Det här exemplet visar hur du implementerar en anpassad tokenprovider. En tokenprovider i Windows Communication Foundation (WCF) används för att tillhandahålla autentiseringsuppgifter till säkerhetsinfrastrukturen. Tokenprovidern undersöker i allmänhet målet och utfärdar lämpliga autentiseringsuppgifter så att säkerhetsinfrastrukturen kan skydda meddelandet. WCF levereras med standardprovidern för Credential Manager-token. WCF levereras också med en CardSpace-tokenprovider. Anpassade tokenprovidrar är användbara i följande fall:
Om du har ett arkiv för autentiseringsuppgifter som dessa tokenprovidrar inte kan använda.
Om du vill ange en egen anpassad mekanism för att omvandla autentiseringsuppgifterna från den tidpunkt då användaren tillhandahåller informationen till när WCF-klientramverket använder autentiseringsuppgifterna.
Om du skapar en anpassad token.
Det här exemplet visar hur du skapar en anpassad tokenprovider som omvandlar indata från användaren till ett annat format.
Sammanfattningsvis visar det här exemplet följande:
Hur en klient kan autentisera med ett användarnamn/lösenordspar.
Hur en klient kan konfigureras med en anpassad tokenprovider.
Hur servern kan verifiera klientens autentiseringsuppgifter med ett lösenord med en anpassad UserNamePasswordValidator som verifierar att användarnamnet och lösenordet matchar.
Hur servern autentiseras av klienten med hjälp av serverns X.509-certifikat.
Det här exemplet visar också hur anroparens identitet är tillgänglig efter autentiseringsprocessen för anpassad token.
Tjänsten exponerar en enskild slutpunkt för kommunikation med tjänsten, definierad med hjälp av konfigurationsfilen App.config. Slutpunkten består av en adress, en bindning och ett kontrakt. Bindningen konfigureras med en standard wsHttpBinding
, som använder meddelandesäkerhet som standard. Det här exemplet anger standarden wsHttpBinding
för att använda autentisering med klientanvändarnamn. Tjänsten konfigurerar även tjänstcertifikatet med hjälp av serviceCredentials-beteendet. Med serviceCredentials-beteendet kan du konfigurera ett tjänstcertifikat. Ett tjänstcertifikat används av en klient för att autentisera tjänsten och tillhandahålla meddelandeskydd. Följande konfiguration refererar till det localhost-certifikat som installerades under exempelkonfigurationen enligt beskrivningen i följande installationsanvisningar.
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<!-- configure base address provided by host -->
<add baseAddress ="http://localhost:8000/servicemodelsamples/service"/>
</baseAddresses>
</host>
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by a client to authenticate the service and provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Klientslutpunktskonfigurationen består av ett konfigurationsnamn, en absolut adress för tjänstslutpunkten, bindningen och kontraktet. Klientbindningen konfigureras med rätt Mode
och meddelande clientCredentialType
.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost:8000/servicemodelsamples/service"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator">
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
Följande steg visar hur du utvecklar en anpassad tokenprovider och integrerar den med WCF-säkerhetsramverket:
Skriv en anpassad tokenprovider.
Exemplet implementerar en anpassad tokenprovider som hämtar användarnamnet och lösenordet. Lösenordet måste matcha det här användarnamnet. Den här anpassade tokenprovidern är endast i demonstrationssyfte och rekommenderas inte för verklig distribution.
För att utföra den här uppgiften härleder den anpassade tokenprovidern SecurityTokenProvider klassen och åsidosätter GetTokenCore(TimeSpan) metoden. Den här metoden skapar och returnerar en ny
UserNameSecurityToken
.protected override SecurityToken GetTokenCore(TimeSpan timeout) { // obtain username and password from the user using console window string username = GetUserName(); string password = GetPassword(); Console.WriteLine("username: {0}", username); // return new UserNameSecurityToken containing information obtained from user return new UserNameSecurityToken(username, password); }
Skriv anpassad säkerhetstokenhanterare.
SecurityTokenManager Används för att skapa SecurityTokenProvider för specifika SecurityTokenRequirement som skickas till den i
CreateSecurityTokenProvider
-metoden. Säkerhetstokenhanteraren används också för att skapa tokenautentiseringar och en token-serialiserare, men de omfattas inte av det här exemplet. I det här exemplet ärver den anpassade säkerhetstokenhanteraren från ClientCredentialsSecurityTokenManager klassen och åsidosätter metoden för att returnera providernCreateSecurityTokenProvider
för anpassad användarnamnstoken när kraven för godkänd token anger att användarnamnsprovidern begärs.public class MyUserNameSecurityTokenManager : ClientCredentialsSecurityTokenManager { MyUserNameClientCredentials myUserNameClientCredentials; public MyUserNameSecurityTokenManager(MyUserNameClientCredentials myUserNameClientCredentials) : base(myUserNameClientCredentials) { this.myUserNameClientCredentials = myUserNameClientCredentials; } public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement) { // if token requirement matches username token return custom username token provider // otherwise use base implementation if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { return new MyUserNameTokenProvider(); } else { return base.CreateSecurityTokenProvider(tokenRequirement); } } }
Skriv en anpassad klientautentiseringsuppgift.
Klassen klientautentiseringsuppgifter används för att representera de autentiseringsuppgifter som har konfigurerats för klientproxyn och skapar en säkerhetstokenhanterare som används för att hämta tokenautentisering, tokenprovidrar och en token-serialiserare.
public class MyUserNameClientCredentials : ClientCredentials { public MyUserNameClientCredentials() : base() { } protected override ClientCredentials CloneCore() { return new MyUserNameClientCredentials(); } public override SecurityTokenManager CreateSecurityTokenManager() { // return custom security token manager return new MyUserNameSecurityTokenManager(this); } }
Konfigurera klienten så att den använder den anpassade klientautentiseringsuppgiften.
För att klienten ska kunna använda den anpassade klientautentiseringsuppgiften tar exemplet bort standardklassen för klientautentiseringsuppgifter och tillhandahåller den nya klassen för klientautentiseringsuppgifter.
static void Main() { // ... // Create a client with given client endpoint configuration CalculatorClient client = new CalculatorClient(); // set new credentials client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials)); client.ChannelFactory.Endpoint.Behaviors.Add(new MyUserNameClientCredentials()); // ... }
Om du vill visa uppringarens information i tjänsten använder du PrimaryIdentity det som visas i följande kodexempel. Innehåller Current anspråksinformation om den aktuella anroparen.
static void DisplayIdentityInformation()
{
Console.WriteLine("\t\tSecurity context identity : {0}",
ServiceSecurityContext.Current.PrimaryIdentity.Name);
}
När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Tryck på RETUR i klientfönstret för att stänga av klienten.
Konfigurera Batch-fil
Med Setup.bat batchfil som ingår i det här exemplet kan du konfigurera servern med relevant certifikat för att köra ett program med egen värd som kräver servercertifikatbaserad säkerhet. Den här batchfilen måste ändras för att fungera mellan datorer eller för att fungera i ett fall som inte är värdbaserat.
Följande ger en kort översikt över de olika avsnitten i batchfilerna så att de kan ändras så att de körs i rätt konfiguration:
Skapa servercertifikatet.
Följande rader från Setup.bat batchfil skapar det servercertifikat som ska användas. Variabeln
%SERVER_NAME%
anger servernamnet. Ändra den här variabeln för att ange ditt eget servernamn. Standardvärdet i den här batchfilen är localhost.echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
Installera servercertifikatet i klientens betrodda certifikatarkiv:
Följande rader i Setup.bat batchfil kopierar servercertifikatet till klientarkivet för betrodda personer. Det här steget krävs eftersom certifikat som genereras av Makecert.exe inte är implicit betrodda av klientsystemet. Om du redan har ett certifikat som är rotat i ett klientbetrott rotcertifikat, till exempel ett Microsoft-utfärdat certifikat, krävs inte det här steget för att fylla i klientcertifikatarkivet med servercertifikatet.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Kommentar
Den Setup.bat batchfilen är utformad för att köras från en Windows SDK-kommandotolk. Det kräver att miljövariabeln MSSDK pekar på katalogen där SDK:et är installerat. Den här miljövariabeln anges automatiskt i en Windows SDK-kommandotolk.
Så här konfigurerar och skapar du exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Skapa lösningen genom att följa anvisningarna i Skapa Windows Communication Foundation-exempel.
Så här kör du exemplet på samma dator
Kör Setup.bat från exempelinstallationsmappen i en Visual Studio-kommandotolk som öppnas med administratörsbehörighet. Detta installerar alla certifikat som krävs för att köra exemplet.
Kommentar
Den Setup.bat batchfilen är utformad för att köras från en Visual Studio-kommandotolk. Variabeln PATH-miljö som angetts i Visual Studio-kommandotolken pekar på katalogen som innehåller körbara filer som krävs av Setup.bat skriptet.
Starta service.exe från service\bin.
Starta Client.exe från \client\bin. Klientaktiviteten visas i klientkonsolprogrammet.
I användarnamnsprompten skriver du ett användarnamn.
I lösenordsprompten använder du samma sträng som angavs för användarnamnsprompten.
Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Så här kör du exemplet mellan datorer
Skapa en katalog på tjänstdatorn för tjänstens binärfiler.
Kopiera tjänstprogramfilerna till tjänstkatalogen på tjänstdatorn. Kopiera även Setup.bat- och Cleanup.bat-filerna till tjänstdatorn.
Du måste ha ett servercertifikat med ämnesnamnet som innehåller datorns fullständigt kvalificerade domännamn. Filen Service.exe.config måste uppdateras för att återspegla det nya certifikatnamnet. Du kan skapa servercertifikat genom att ändra Setup.bat batchfil. Observera att filen setup.bat måste köras från en kommandotolk för utvecklare för Visual Studio som öppnas med administratörsbehörighet. Du måste ange
%SERVER_NAME%
variabeln till fullständigt kvalificerat värdnamn för den dator som används som värd för tjänsten.Kopiera servercertifikatet till CurrentUser-Trusted Personer-arkivet för klienten. Du behöver inte göra detta när servercertifikatet utfärdas av en betrodd klientutfärdare.
I filen Service.exe.config på tjänstdatorn ändrar du värdet för basadressen för att ange ett fullständigt kvalificerat datornamn i stället för localhost.
På tjänstdatorn kör du service.exe från en kommandotolk.
Kopiera klientprogramfilerna från mappen \client\bin\ under den språkspecifika mappen till klientdatorn.
I filen Client.exe.config på klientdatorn ändrar du slutpunktens adressvärde så att det matchar tjänstens nya adress.
Starta från ett kommandotolksfönster på klientdatorn
Client.exe
.Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Rensa efter exemplet
- Kör Cleanup.bat i exempelmappen när du har kört exemplet.