Udostępnij za pośrednictwem


Dostawca tokenów

W tym przykładzie pokazano, jak zaimplementować niestandardowego dostawcę tokenów. Dostawca tokenów w programie Windows Communication Foundation (WCF) służy do dostarczania poświadczeń do infrastruktury zabezpieczeń. Dostawca tokenu ogólnie sprawdza cel i wystawia odpowiednie poświadczenia, aby infrastruktura zabezpieczeń mogła zabezpieczyć komunikat. Program WCF jest dostarczany z domyślnym dostawcą tokenów menedżera poświadczeń. Program WCF jest również dostarczany z dostawcą tokenów CardSpace. Niestandardowi dostawcy tokenów są przydatni w następujących przypadkach:

  • Jeśli masz magazyn poświadczeń, z którym ci dostawcy tokenów nie mogą działać.

  • Jeśli chcesz podać własny mechanizm niestandardowy do przekształcania poświadczeń z punktu, gdy użytkownik podaje szczegółowe informacje, kiedy struktura klienta WCF używa poświadczeń.

  • Jeśli tworzysz token niestandardowy.

W tym przykładzie pokazano, jak utworzyć niestandardowego dostawcę tokenów, który przekształca dane wejściowe użytkownika w inny format.

Podsumowując, w tym przykładzie przedstawiono następujące kwestie:

  • Jak klient może uwierzytelniać się przy użyciu pary nazwy użytkownika/hasła.

  • Jak można skonfigurować klienta za pomocą niestandardowego dostawcy tokenów.

  • Jak serwer może zweryfikować poświadczenia klienta przy użyciu hasła z niestandardowym UserNamePasswordValidator , który weryfikuje, czy nazwa użytkownika i hasło są zgodne.

  • Sposób uwierzytelniania serwera przez klienta przy użyciu certyfikatu X.509 serwera.

W tym przykładzie pokazano również, jak tożsamość wywołującego jest dostępna po procesie uwierzytelniania tokenu niestandardowego.

Usługa uwidacznia pojedynczy punkt końcowy do komunikowania się z usługą, zdefiniowany przy użyciu pliku konfiguracji App.config. Punkt końcowy składa się z adresu, powiązania i kontraktu. Powiązanie jest konfigurowane przy użyciu standardu wsHttpBinding, który domyślnie używa zabezpieczeń komunikatów. W tym przykładzie ustawiono standard wsHttpBinding uwierzytelniania nazwy użytkownika klienta. Usługa konfiguruje również certyfikat usługi przy użyciu zachowania serviceCredentials. Zachowanie serviceCredentials umożliwia skonfigurowanie certyfikatu usługi. Certyfikat usługi jest używany przez klienta do uwierzytelniania usługi i zapewniania ochrony komunikatów. Poniższa konfiguracja odwołuje się do certyfikatu localhost zainstalowanego podczas przykładowej konfiguracji zgodnie z opisem w poniższych instrukcjach konfiguracji.

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

Konfiguracja punktu końcowego klienta składa się z nazwy konfiguracji, bezwzględnego adresu punktu końcowego usługi, powiązania i kontraktu. Powiązanie klienta jest konfigurowane przy użyciu odpowiedniego Mode komunikatu clientCredentialTypei .

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

W poniższych krokach pokazano, jak utworzyć niestandardowego dostawcę tokenów i zintegrować go z platformą zabezpieczeń WCF:

  1. Napisz niestandardowego dostawcę tokenów.

    Przykład implementuje niestandardowego dostawcę tokenów, który uzyskuje nazwę użytkownika i hasło. Hasło musi być zgodne z tą nazwą użytkownika. Ten niestandardowy dostawca tokenów jest przeznaczony tylko do celów demonstracyjnych i nie jest zalecany do wdrożenia w świecie rzeczywistym.

    Aby wykonać to zadanie, niestandardowy dostawca tokenu uzyskuje klasę SecurityTokenProvider i zastępuje metodę GetTokenCore(TimeSpan) . Ta metoda tworzy i zwraca nowy UserNameSecurityTokenelement .

    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);
    }
    
  2. Pisanie niestandardowego menedżera tokenów zabezpieczających.

    Element SecurityTokenManager jest używany do utworzenia SecurityTokenProvider dla określonego SecurityTokenRequirement elementu, który jest przekazywany do niego w CreateSecurityTokenProvider metodzie . Menedżer tokenów zabezpieczających jest również używany do tworzenia wystawców uwierzytelnień tokenów i serializatora tokenów, ale nie są one objęte tym przykładem. W tym przykładzie niestandardowy menedżer tokenów zabezpieczających dziedziczy z ClientCredentialsSecurityTokenManager klasy i zastępuje CreateSecurityTokenProvider metodę, aby zwrócić niestandardowego dostawcę tokenu nazwy użytkownika, gdy przekazane wymagania dotyczące tokenu wskazują, że dostawca nazwy użytkownika jest żądany.

    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);
            }
        }
    }
    
  3. Napisz niestandardowe poświadczenia klienta.

    Klasa poświadczeń klienta służy do reprezentowania poświadczeń skonfigurowanych dla serwera proxy klienta i tworzy menedżera tokenów zabezpieczających, który jest używany do uzyskiwania wystawców uwierzytelnień tokenów, dostawców tokenów i serializatora tokenów.

    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);
        }
    }
    
  4. Skonfiguruj klienta tak, aby używał niestandardowych poświadczeń klienta.

    Aby klient używał niestandardowych poświadczeń klienta, przykład usuwa domyślną klasę poświadczeń klienta i dostarcza nową klasę poświadczeń klienta.

    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());
       // ...
    }
    

W usłudze, aby wyświetlić informacje wywołującego, użyj elementu PrimaryIdentity , jak pokazano w poniższym przykładzie kodu. Zawiera Current informacje o aktualnym obiekcie wywołującym.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tSecurity context identity  :  {0}",
        ServiceSecurityContext.Current.PrimaryIdentity.Name);
}

Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Naciśnij klawisz ENTER w oknie klienta, aby zamknąć klienta.

Konfigurowanie pliku wsadowego

Plik wsadowy Setup.bat dołączony do tego przykładu umożliwia skonfigurowanie serwera z odpowiednim certyfikatem w celu uruchomienia aplikacji hostowanej samodzielnie, która wymaga zabezpieczeń opartych na certyfikatach serwera. Ten plik wsadowy należy zmodyfikować tak, aby działał na komputerach lub działać w przypadku innym niż hostowany.

Poniżej przedstawiono krótkie omówienie różnych sekcji plików wsadowych, dzięki czemu można je zmodyfikować w celu uruchomienia w odpowiedniej konfiguracji:

  • Tworzenie certyfikatu serwera.

    Następujące wiersze z pliku wsadowego Setup.bat tworzą certyfikat serwera do użycia. Zmienna %SERVER_NAME% określa nazwę serwera. Zmień tę zmienną, aby określić własną nazwę serwera. Wartość domyślna w tym pliku wsadowym to 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
    
  • Zainstalowanie certyfikatu serwera w zaufanym magazynie certyfikatów klienta:

    Następujące wiersze w pliku wsadowym Setup.bat skopiuj certyfikat serwera do magazynu zaufanych osób klienta. Ten krok jest wymagany, ponieważ certyfikaty generowane przez Makecert.exe nie są niejawnie zaufane przez system kliencki. Jeśli masz już certyfikat, który jest root w zaufanym certyfikacie głównym klienta — na przykład certyfikat wystawiony przez firmę Microsoft — ten krok wypełniania magazynu certyfikatów klienta przy użyciu certyfikatu serwera nie jest wymagany.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

Uwaga

Plik wsadowy Setup.bat jest przeznaczony do uruchamiania z wiersza polecenia zestawu Windows SDK. Wymaga to, aby zmienna środowiskowa MSSDK wskazywała katalog, w którym zainstalowano zestaw SDK. Ta zmienna środowiskowa jest automatycznie ustawiana w wierszu polecenia zestawu Windows SDK.

Aby skonfigurować i skompilować przykład

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

  2. Aby skompilować rozwiązanie, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

Aby uruchomić przykład na tym samym komputerze

  1. Uruchom Setup.bat z folderu instalacji przykładowej w wierszu polecenia programu Visual Studio otwartym 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.

  2. Uruchom service.exe z pliku service\bin.

  3. Uruchom Client.exe z \client\bin. Działanie klienta jest wyświetlane w aplikacji konsolowej klienta.

  4. W wierszu polecenia nazwy użytkownika wpisz nazwę użytkownika.

  5. W wierszu polecenia hasła użyj tego samego ciągu, który został wpisany dla monitu o nazwę użytkownika.

  6. 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. Utwórz katalog na komputerze usługi dla plików binarnych usługi.

  2. Skopiuj pliki programu usługi do katalogu usługi na komputerze usługi. Skopiuj również pliki Setup.bat i Cleanup.bat na komputer usługi.

  3. Musisz mieć certyfikat serwera o nazwie podmiotu, który zawiera w pełni kwalifikowaną nazwę domeny komputera. Aby odzwierciedlić tę nową nazwę certyfikatu, należy zaktualizować plik Service.exe.config. Certyfikat serwera można utworzyć, modyfikując plik wsadowy Setup.bat. Należy pamiętać, że plik setup.bat musi zostać uruchomiony z poziomu wiersza polecenia dewelopera dla programu Visual Studio otwartego z uprawnieniami administratora. Należy ustawić %SERVER_NAME% zmienną na w pełni kwalifikowaną nazwę hosta komputera, który jest używany do hostowania usługi.

  4. Skopiuj certyfikat serwera do magazynu CurrentUser-Trusted Osoby klienta. Nie trzeba tego robić, gdy certyfikat serwera jest wystawiany przez zaufanego wystawcę klienta.

  5. W pliku Service.exe.config na komputerze usługi zmień wartość adresu podstawowego, aby określić w pełni kwalifikowaną nazwę komputera zamiast hosta lokalnego.

  6. Na komputerze usługi uruchom service.exe z wiersza polecenia.

  7. Skopiuj pliki programu klienckiego z folderu \client\bin\ w folderze specyficznym dla języka na komputer kliencki.

  8. W pliku Client.exe.config na komputerze klienckim zmień wartość adresu punktu końcowego, aby był zgodny z nowym adresem usługi.

  9. Na komputerze klienckim uruchom polecenie Client.exe w oknie wiersza polecenia.

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

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