Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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. WCF jest wyposażony w domyślnego 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 dostawcy tokenów nie mogą współpracować.
Jeśli chcesz podać własny mechanizm niestandardowy do przekształcania poświadczeń od momentu podania szczegółowych informacji przez użytkownika do chwili, gdy framework 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, używając hasła za pomocą niestandardowego UserNamePasswordValidator, który sprawdza zgodność nazwy użytkownika i hasła.
Sposób uwierzytelniania serwera przez klienta przy użyciu certyfikatu X.509 serwera.
Przykład pokazuje również, jak tożsamość wywołującego jest dostępna po procesie uwierzytelniania tokenu użytkownika.
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, aby używać uwierzytelniania przy pomocy nazwy użytkownika klienta. Usługa konfiguruje również certyfikat usługi za pomocą 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 odpowiednich wartości Mode i komunikatów 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>
W poniższych krokach pokazano, jak utworzyć niestandardowego dostawcę tokenów i zintegrować go z platformą zabezpieczeń WCF:
Napisz dostawcę niestandardowych 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); }Napisz niestandardowego menedżera tokenów zabezpieczających.
SecurityTokenManager służy do tworzenia SecurityTokenProvider dla SecurityTokenRequirement przekazywanego do niego w metodzie
CreateSecurityTokenProvider. 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 klasy ClientCredentialsSecurityTokenManager i nadpisuje metodęCreateSecurityTokenProvider, aby zwrócić niestandardowego dostawcę tokenu nazwy użytkownika, gdy przekazane wymagania dotyczące tokenu wskazują, że żądany jest dostawca nazwy użytkownika.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); } } }Napisz niestandardowe poświadczenie 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); } }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. Kontener Current zawiera informacje o aktualnym 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 ENTER w oknie klienta, aby zamknąć klienta.
Skonfiguruj plik wsadowy
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 -peZainstalowanie certyfikatu serwera w zaufanym magazynie certyfikatów klienta:
Następujące wiersze w pliku wsadowym Setup.bat kopiują certyfikat serwera do magazynu zaufanych certyfikatów klienta. Ten krok jest wymagany, ponieważ certyfikaty generowane przez Makecert.exe nie są automatycznie uznawane za zaufane przez system klienta. Jeśli masz już certyfikat osadzony w zaufanym certyfikacie głównym klienta — na przykład certyfikat wystawiony przez firmę Microsoft — ten krok dodawania certyfikatu serwera do magazynu certyfikatów klienta nie jest wymagany.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Uwaga / Notatka
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
Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.
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
Uruchom polecenie Setup.bat z folderu instalacji przykładowej w wierszu polecenia programu Visual Studio otwartym z uprawnieniami administratora. To instaluje wszystkie certyfikaty wymagane do uruchomienia próbki.
Uwaga / Notatka
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.
Uruchom service.exe z pliku service\bin.
Uruchom Client.exe z \client\bin. Działanie klienta jest wyświetlane w aplikacji konsolowej klienta.
Na zachęcie do wprowadzenia nazwy użytkownika, wpisz nazwę użytkownika.
Przy monicie o hasło użyj tego samego ciągu, który został wpisany przy monicie o nazwę użytkownika.
Jeśli klient i usługa nie mogą się komunikować, sprawdź sekcję „Wskazówki dotyczące rozwiązywania problemów z przykładami programu WCF”.
Aby uruchomić próbkę na komputerach
Utwórz katalog na komputerze usługi dla plików binarnych usługi.
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.
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.Skopiuj certyfikat serwera do magazynu CurrentUser-TrustedPeople klienta. Nie trzeba tego robić, gdy certyfikat serwera jest wystawiany przez zaufanego wystawcę klienta.
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.
Na komputerze serwisowym uruchom service.exe z wiersza polecenia.
Skopiuj pliki programu klienckiego z folderu \client\bin\ w folderze specyficznym dla języka na komputer kliencki.
W pliku Client.exe.config na komputerze klienckim zmień wartość adresu punktu końcowego, aby odpowiadała nowemu adresowi usługi.
Na komputerze klienckim uruchom polecenie
Client.exew oknie wiersza polecenia.Jeśli klient i usługa nie mogą się komunikować, sprawdź sekcję „Wskazówki dotyczące rozwiązywania problemów z przykładami programu WCF”.
Aby posprzątać po próbie
- Uruchom Cleanup.bat w folderze próbek po zakończeniu uruchamiania próbki.