Dela via


Exempel på tjänstidentitet

Det här tjänstidentitetsexemplet visar hur du anger identiteten för en tjänst. Vid designtillfället kan en klient hämta identiteten med hjälp av tjänstens metadata och sedan vid körningstillfället kan klienten autentisera tjänstens identitet. Begreppet tjänstidentitet är att tillåta att en klient autentiserar en tjänst innan någon av dess åtgärder anropas, vilket skyddar klienten från oautentiserade anrop. Vid en säker anslutning autentiserar tjänsten även en klients autentiseringsuppgifter innan den tillåts åtkomst, men det här är inte fokus för det här exemplet. Se exemplen i Klienten som visar serverautentisering.

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Det här exemplet illustrerar följande funktioner:

  • Så här anger du olika typer av identiteter på olika slutpunkter för en tjänst. Varje typ av identitet har olika funktioner. Vilken typ av identitet som ska användas beror på vilken typ av säkerhetsautentiseringsuppgifter som används på slutpunktens bindning.

  • Identiteten kan antingen anges deklarativt i konfigurationen eller imperativt i kod. Vanligtvis för både klienten och tjänsten bör du använda konfigurationen för att ange identiteten.

  • Så här anger du en anpassad identitet på klienten. En anpassad identitet är vanligtvis en anpassning av en befintlig typ av identitet som gör det möjligt för klienten att undersöka annan anspråksinformation som tillhandahålls i tjänstens autentiseringsuppgifter för att fatta auktoriseringsbeslut innan tjänsten anropas.

    Kommentar

    Det här exemplet kontrollerar identiteten för ett specifikt certifikat som heter identity.com och RSA-nyckeln som finns i det här certifikatet. När du använder identitetstyperna Certifikat och RSA i konfigurationen på klienten är ett enkelt sätt att hämta dessa värden att inspektera WSDL för tjänsten där dessa värden serialiseras.

Följande exempelkod visar hur du konfigurerar identiteten för en tjänstslutpunkt med DNS (Domain Name Server) för ett certifikat med hjälp av en WSHttpBinding.

//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;

Identiteten kan också anges i konfigurationen i App.config-filen. I följande exempel visas hur du ställer in UPN-identiteten (användarens huvudnamn) för en tjänstslutpunkt.

<endpoint address="upnidentity"
        behaviorConfiguration=""
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_Windows"
        name="WSHttpBinding_ICalculator_Windows"
        contract="Microsoft.ServiceModel.Samples.ICalculator">
  <!-- Set the UPN identity for this endpoint -->
  <identity>
      <userPrincipalName value="host\myservice.com" />
  </identity >
</endpoint>

En anpassad identitet kan anges på klienten genom att härleda från klasserna EndpointIdentityIdentityVerifier och . Konceptuellt IdentityVerifier kan klassen anses vara klientens motsvarighet till tjänstens AuthorizationManager klass. I följande kodexempel visas en implementering av OrgEndpointIdentity, som lagrar ett organisationsnamn som ska matchas i ämnesnamnet för serverns certifikat. Auktoriseringskontrollen för organisationsnamnet sker i CheckAccess -metoden i CustomIdentityVerifier klassen.

// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }
    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}",claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
}

Det här exemplet använder ett certifikat som heter identity.com som finns i mappen för språkspecifik identitetslösning.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.

Så här kör du exemplet på samma dator

  1. I Windows XP eller Windows Vista importerar du certifikatfilen Identity.pfx i mappen Identitetslösning till certifikatarkivet LocalMachine/My (Personal) med hjälp av MMC-snapin-verktyget. Den här filen är lösenordsskyddad. Under importen uppmanas du att ange ett lösenord. Skriv xyz in i lösenordsrutan. Mer information finns i avsnittet Så här visar du certifikat med MMC-snapin-modulen . När detta är klart kör du Setup.bat i en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet, som kopierar certifikatet till CurrentUser/Trusted Personer store för användning på klienten.

  2. På Windows Server 2003 kör du Setup.bat från exempelinstallationsmappen i en Visual Studio-kommandotolk 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. Se till att du tar bort certifikaten genom att köra Cleanup.bat när du är klar med exemplet. Andra säkerhetsexempel använder samma certifikat.

  3. Starta Service.exe från katalogen \service\bin. Se till att tjänsten anger att den är klar och visar en uppmaning till Tryck på <Retur> för att avsluta tjänsten.

  4. Starta Client.exe från katalogen \client\bin eller genom att trycka på F5 i Visual Studio för att skapa och köra. Klientaktiviteten visas i klientkonsolprogrammet.

  5. 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

  1. Innan du skapar klientdelen av exemplet måste du ändra värdet för tjänstens slutpunktsadress i Client.cs-filen i CallServiceCustomClientIdentity -metoden. Skapa sedan exemplet.

  2. Skapa en katalog på tjänstdatorn.

  3. Kopiera tjänstprogramfilerna från service\bin till katalogen på tjänstdatorn. Kopiera även Setup.bat- och Cleanup.bat-filerna till tjänstdatorn.

  4. Skapa en katalog på klientdatorn för klient binärfilerna.

  5. Kopiera klientprogramfilerna till klientkatalogen på klientdatorn. Kopiera även filerna Setup.bat, Cleanup.bat och ImportServiceCert.bat till klienten.

  6. I tjänsten kör du setup.bat service i en kommandotolk för utvecklare för Visual Studio som öppnats med administratörsbehörighet. När du service kör setup.bat med argumentet skapas ett tjänstcertifikat med datorns fullständigt kvalificerade domännamn och tjänstcertifikatet exporteras till en fil med namnet Service.cer.

  7. Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.

  8. I filen Client.exe.config på klientdatorn ändrar du slutpunktens adressvärde så att det matchar tjänstens nya adress. Det finns flera instanser som måste ändras.

  9. På klienten kör du ImportServiceCert.bat i en kommandotolk för utvecklare för Visual Studio som öppnas med administratörsbehörighet. Detta importerar tjänstcertifikatet från filen Service.cer till arkivet CurrentUser – Trusted Personer.

  10. Starta Service.exe från kommandotolken på tjänstdatorn.

  11. Starta Client.exe från en kommandotolk på klientdatorn. 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.

    Kommentar

    Det här skriptet tar inte bort tjänstcertifikat på en klient när du kör det här exemplet på flera datorer. Om du har kört WCF-exempel (Windows Communication Foundation) som använder certifikat mellan datorer måste du rensa de tjänstcertifikat som har installerats i arkivet CurrentUser – Trusted Personer. Det gör du genom att använda följande kommando: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Till exempel: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.