Udostępnij za pośrednictwem


Tożsamość usług — przykład

W tym przykładzie tożsamości usługi pokazano, jak ustawić tożsamość dla usługi. W czasie projektowania klient może pobrać tożsamość przy użyciu metadanych usługi, a następnie w czasie wykonywania klient może uwierzytelnić tożsamość usługi. Pojęcie tożsamości usługi polega na umożliwieniu klientowi uwierzytelniania usługi przed wywołaniem któregokolwiek z jego operacji, co chroni klienta przed nieuwierzytelnionymi wywołaniami. W bezpiecznym połączeniu usługa uwierzytelnia również poświadczenia klienta przed zezwoleniem na dostęp, ale nie jest to fokus tego przykładu. Zobacz przykłady w kliencie pokazującym uwierzytelnianie serwera.

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

W tym przykładzie przedstawiono następujące funkcje:

  • Jak ustawić różne typy tożsamości w różnych punktach końcowych dla usługi. Każdy typ tożsamości ma różne możliwości. Typ tożsamości do użycia zależy od typu poświadczeń zabezpieczeń używanych w powiązaniu punktu końcowego.

  • Tożsamość może być ustawiana deklaratywnie w konfiguracji lub imperatywnie w kodzie. Zazwyczaj zarówno dla klienta, jak i usługi należy użyć konfiguracji, aby ustawić tożsamość.

  • Jak ustawić tożsamość niestandardową na kliencie. Tożsamość niestandardowa to zazwyczaj dostosowanie istniejącego typu tożsamości, które umożliwia klientowi sprawdzenie innych informacji oświadczeń podanych w poświadczeniach usługi w celu podejmowania decyzji dotyczących autoryzacji przed wywołaniem usługi.

    Uwaga

    Ten przykład sprawdza tożsamość określonego certyfikatu o nazwie identity.com i klucza RSA zawartego w tym certyfikacie. W przypadku używania typów tożsamości Certyfikat i RSA w konfiguracji na kliencie można łatwo uzyskać te wartości, to sprawdzenie WSDL dla usługi, w której te wartości są serializowane.

Poniższy przykładowy kod pokazuje, jak skonfigurować tożsamość punktu końcowego usługi przy użyciu serwera nazw domen (DNS) certyfikatu przy użyciu usługi 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;

Tożsamość można również określić w konfiguracji w pliku App.config. W poniższym przykładzie pokazano, jak skonfigurować tożsamość nazwy UPN (głównej nazwy użytkownika) dla punktu końcowego usługi.

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

Tożsamość niestandardową można ustawić na kliencie, wyprowadzając je z EndpointIdentity klas i IdentityVerifier . Koncepcyjnie klasę IdentityVerifier można uznać za odpowiednik klienta klasy usługi AuthorizationManager . Poniższy przykład kodu przedstawia implementację OrgEndpointIdentityklasy , która przechowuje nazwę organizacji zgodną z nazwą podmiotu certyfikatu serwera. Sprawdzanie autoryzacji dla nazwy organizacji odbywa się w metodzie CheckAccess w CustomIdentityVerifier klasie .

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

W tym przykładzie użyto certyfikatu o nazwie identity.com, który znajduje się w folderze rozwiązania identity specyficznym dla języka.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między komputerami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

Aby uruchomić przykład na tym samym komputerze

  1. W systemie Windows XP lub Windows Vista zaimportuj plik certyfikatu Identity.pfx w folderze rozwiązania Identity do magazynu certyfikatów LocalMachine/My (Osobiste) przy użyciu narzędzia przystawki MMC. Ten plik jest chroniony hasłem. Podczas importowania zostanie wyświetlony monit o podanie hasła. Wpisz xyz w polu hasło. Aby uzyskać więcej informacji, zobacz temat How to: View Certificates with the MMC Snap-in (Instrukcje: wyświetlanie certyfikatów za pomocą przystawki MMC). Po wykonaniu tej czynności uruchom Setup.bat w wierszu polecenia dewelopera programu Visual Studio z uprawnieniami administratora, który kopiuje ten certyfikat do magazynu CurrentUser/Trusted Osoby do użycia na kliencie.

  2. W systemie Windows Server 2003 uruchom Setup.bat z przykładowego folderu instalacji w wierszu polecenia programu Visual Studio z uprawnieniami administratora. Spowoduje to zainstalowanie wszystkich certyfikatów wymaganych do uruchomienia przykładu.

    Uwaga

    Plik wsadowy Setup.bat jest przeznaczony do uruchamiania z poziomu wiersza polecenia programu Visual Studio. Zmienna środowiskowa PATH ustawiona w wierszu polecenia programu Visual Studio wskazuje katalog zawierający pliki wykonywalne wymagane przez skrypt Setup.bat. Upewnij się, że certyfikaty zostały usunięte, uruchamiając Cleanup.bat po zakończeniu pracy z przykładem. Inne przykłady zabezpieczeń używają tych samych certyfikatów.

  3. Uruchom Service.exe z katalogu \service\bin. Upewnij się, że usługa wskazuje, że jest gotowa i wyświetla monit o zakończenie działania usługi przez naciśnięcie <klawisza Enter> .

  4. Uruchom Client.exe z katalogu \client\bin lub naciskając klawisz F5 w programie Visual Studio, aby skompilować i uruchomić. Działanie klienta jest wyświetlane w aplikacji konsolowej klienta.

  5. Jeśli klient i usługa nie mogą się komunikować, zobacz Rozwiązywanie problemów Wskazówki dla przykładów programu WCF.

Aby uruchomić przykład na komputerach

  1. Przed utworzeniem części klienta przykładu pamiętaj, aby zmienić wartość adresu punktu końcowego usługi w pliku Client.cs w metodzie CallServiceCustomClientIdentity . Następnie skompiluj przykład.

  2. Utwórz katalog na komputerze usługi.

  3. Skopiuj pliki programu usługi z pliku service\bin do katalogu na komputerze usługi. Skopiuj również pliki Setup.bat i Cleanup.bat na komputer usługi.

  4. Utwórz katalog na komputerze klienckim dla plików binarnych klienta.

  5. Skopiuj pliki programu klienckiego do katalogu klienta na komputerze klienckim. Skopiuj również pliki Setup.bat, Cleanup.bat i ImportServiceCert.bat do klienta.

  6. W usłudze uruchom polecenie setup.bat service w wierszu polecenia dla deweloperów dla programu Visual Studio otwarte z uprawnieniami administratora. Uruchomienie setup.bat z argumentem service powoduje utworzenie certyfikatu usługi z w pełni kwalifikowaną nazwą domeny komputera i eksportuje certyfikat usługi do pliku o nazwie Service.cer.

  7. Skopiuj plik Service.cer z katalogu usługi do katalogu klienta na komputerze klienckim.

  8. W pliku Client.exe.config na komputerze klienckim zmień wartość adresu punktu końcowego, aby był zgodny z nowym adresem usługi. Istnieje wiele wystąpień, które należy zmienić.

  9. Na kliencie uruchom ImportServiceCert.bat w wierszu polecenia dewelopera dla programu Visual Studio otwartym z uprawnieniami administratora. Spowoduje to zaimportowanie certyfikatu usługi z pliku Service.cer do magazynu CurrentUser — Trusted Osoby.

  10. Na komputerze usługi uruchom Service.exe z wiersza polecenia.

  11. Na komputerze klienckim uruchom Client.exe z wiersza polecenia. Jeśli klient i usługa nie mogą się komunikować, zobacz Rozwiązywanie problemów Wskazówki dla przykładów programu WCF.

Aby wyczyścić po próbce

  • Uruchom Cleanup.bat w folderze samples po zakończeniu uruchamiania przykładu.

    Uwaga

    Ten skrypt nie usuwa certyfikatów usługi na kliencie podczas uruchamiania tego przykładu na komputerach. Jeśli uruchomiono przykłady programu Windows Communication Foundation (WCF) korzystające z certyfikatów na komputerach, pamiętaj, aby wyczyścić certyfikaty usługi zainstalowane w magazynie CurrentUser — Trusted Osoby. W tym celu użyj następującego polecenia: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> na przykład: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.