Delen via


Voorbeeld van service-identiteit

In dit voorbeeld van een service-identiteit ziet u hoe u de identiteit voor een service instelt. Tijdens het ontwerp kan een client de identiteit ophalen met behulp van de metagegevens van de service en vervolgens tijdens runtime kan de client de identiteit van de service verifiëren. Het concept van service-identiteit is dat een client een service kan verifiëren voordat een van de bewerkingen wordt aangeroepen, waardoor de client wordt beschermd tegen niet-geverifieerde aanroepen. Bij een beveiligde verbinding verifieert de service ook de referenties van een client voordat deze toegang krijgt, maar dit is niet de focus van dit voorbeeld. Bekijk de voorbeelden in client die serververificatie tonen.

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

In dit voorbeeld ziet u de volgende functies:

  • De verschillende typen identiteiten instellen op verschillende eindpunten voor een service. Elk type identiteit heeft verschillende mogelijkheden. Het type identiteit dat moet worden gebruikt, is afhankelijk van het type beveiligingsreferenties dat wordt gebruikt voor de binding van het eindpunt.

  • Identiteit kan declaratief worden ingesteld in configuratie of imperatief in code. Normaal gesproken moet u voor zowel de client als de service de configuratie gebruiken om de identiteit in te stellen.

  • Een aangepaste identiteit instellen op de client. Een aangepaste identiteit is doorgaans een aanpassing van een bestaand type identiteit waarmee de client andere claimgegevens in de referenties van de service kan onderzoeken om autorisatiebeslissingen te nemen voordat de service wordt aangeroepen.

    Notitie

    In dit voorbeeld wordt de identiteit gecontroleerd van een specifiek certificaat met de naam identity.com en de RSA-sleutel in dit certificaat. Wanneer u de certificaat- en RSA-identiteitstypen in de configuratie op de client gebruikt, kunt u deze waarden eenvoudig verkrijgen door de WSDL te inspecteren voor de service waarin deze waarden worden geserialiseerd.

De volgende voorbeeldcode laat zien hoe u de identiteit van een service-eindpunt configureert met de Domain Name Server (DNS) van een certificaat met behulp van een 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;

De identiteit kan ook worden opgegeven in de configuratie in het App.config-bestand. In het volgende voorbeeld ziet u hoe u de UPN-identiteit (User Principal Name) instelt voor een service-eindpunt.

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

Een aangepaste identiteit kan op de client worden ingesteld door de en de IdentityVerifier klassen te ontlenenEndpointIdentity. Conceptueel gezien kan de IdentityVerifier klasse worden beschouwd als het clientequivalent van de klasse van AuthorizationManager de service. In het volgende codevoorbeeld ziet u een implementatie van OrgEndpointIdentity, waarmee een organisatienaam wordt opgeslagen die overeenkomt met de onderwerpnaam van het certificaat van de server. De autorisatiecontrole voor de organisatienaam vindt plaats in de CheckAccess methode in de CustomIdentityVerifier klasse.

// 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;
    }
}

In dit voorbeeld wordt een certificaat met de naam identity.com gebruikt, dat zich in de taalspecifieke map voor de identiteitsoplossing bevindt.

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie van één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.

Het voorbeeld uitvoeren op dezelfde computer

  1. Importeer in Windows XP of Windows Vista het identity.pfx-certificaatbestand in de map Identity Solution in het certificaatarchief LocalMachine/My (Persoonlijk) met behulp van de MMC-module. Dit bestand is beveiligd met een wachtwoord. Tijdens het importeren wordt u om een wachtwoord gevraagd. Typ xyz in het wachtwoordvak. Zie de instructies voor het weergeven van certificaten met het mmc-moduleonderwerp voor meer informatie. Zodra dit is gebeurd, voert u Setup.bat uit in een opdrachtprompt voor ontwikkelaars voor Visual Studio met beheerdersbevoegdheden, waarmee dit certificaat wordt gekopieerd naar het currentuser-/vertrouwde Mensen archief voor gebruik op de client.

  2. Voer in Windows Server 2003 Setup.bat uit vanuit de voorbeeldinstallatiemap in een Visual Studio-opdrachtprompt met beheerdersbevoegdheden. Hiermee worden alle certificaten geïnstalleerd die vereist zijn voor het uitvoeren van het voorbeeld.

    Notitie

    Het Setup.bat batchbestand is ontworpen om te worden uitgevoerd vanaf een Visual Studio-opdrachtprompt. De omgevingsvariabele PATH die in de Visual Studio-opdrachtprompt is ingesteld, verwijst naar de map met uitvoerbare bestanden die zijn vereist voor het Setup.bat script. Zorg ervoor dat u de certificaten verwijdert door Cleanup.bat uit te voeren wanneer u klaar bent met het voorbeeld. Andere beveiligingsvoorbeelden gebruiken dezelfde certificaten.

  3. Start Service.exe vanuit de map \service\bin. Zorg ervoor dat de service aangeeft dat deze gereed is en geeft een prompt weer om op <Enter> te drukken om de service te beëindigen.

  4. Start Client.exe vanuit de map \client\bin of druk op F5 in Visual Studio om te bouwen en uit te voeren. Clientactiviteit wordt weergegeven in de clientconsoletoepassing.

  5. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.

Het voorbeeld uitvoeren op computers

  1. Voordat u het clientonderdeel van het voorbeeld bouwt, moet u de waarde voor het eindpuntadres van de service in het Client.cs-bestand in de CallServiceCustomClientIdentity methode wijzigen. Bouw vervolgens het voorbeeld.

  2. Maak een map op de servicecomputer.

  3. Kopieer de programmabestanden van de service van service\bin naar de map op de servicecomputer. Kopieer ook de Setup.bat- en Cleanup.bat-bestanden naar de servicecomputer.

  4. Maak een map op de clientcomputer voor de binaire clientbestanden.

  5. Kopieer de clientprogrammabestanden naar de clientmap op de clientcomputer. Kopieer ook de bestanden Setup.bat, Cleanup.bat en ImportServiceCert.bat naar de client.

  6. Voer setup.bat service op de service uit in een opdrachtprompt voor ontwikkelaars voor Visual Studio die is geopend met beheerdersbevoegdheden. Als u het service argument uitvoertsetup.bat, maakt u een servicecertificaat met de volledig gekwalificeerde domeinnaam van de computer en exporteert u het servicecertificaat naar een bestand met de naam Service.cer.

  7. Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.

  8. Wijzig in het bestand Client.exe.config op de clientcomputer de adreswaarde van het eindpunt zodat deze overeenkomt met het nieuwe adres van uw service. Er zijn meerdere exemplaren die moeten worden gewijzigd.

  9. Voer op de client ImportServiceCert.bat uit in een opdrachtprompt voor ontwikkelaars voor Visual Studio die is geopend met beheerdersbevoegdheden. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het CurrentUser - Trusted Mensen-archief.

  10. Start op de servicecomputer de Service.exe vanaf de opdrachtprompt.

  11. Start Client.exe vanaf een opdrachtprompt op de clientcomputer. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.

Opschonen na het voorbeeld

  • Voer Cleanup.bat uit in de map met voorbeelden zodra u klaar bent met het uitvoeren van het voorbeeld.

    Notitie

    Dit script verwijdert geen servicecertificaten op een client bij het uitvoeren van dit voorbeeld op computers. Als u WCF-voorbeelden (Windows Communication Foundation) hebt uitgevoerd die gebruikmaken van certificaten op computers, moet u de servicecertificaten wissen die zijn geïnstalleerd in het CurrentUser - Trusted Mensen-archief. Gebruik hiervoor de volgende opdracht: bijvoorbeeld: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.