Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato ukázka ukazuje, jak implementovat vlastní ověřovací program tokenu. Ověřovací program tokenu ve Službě Windows Communication Foundation (WCF) slouží k ověřování tokenu používaného se zprávou, ověření, že je konzistentní, a ověřování identity přidružené k tokenu.
Ověřovače vlastních tokenů jsou užitečné v různých případech, například:
Pokud chcete přepsat výchozí ověřovací mechanismus přidružený k tokenu.
Při vytváření vlastního tokenu.
Tato ukázka ukazuje následující:
Jak se klient může ověřit pomocí páru uživatelského jména a hesla.
Jak může server ověřit přihlašovací údaje klienta pomocí vlastního ověřovacího objektu tokenu.
Jak se kód služby WCF spojuje s vlastní autentizátorem tokenu.
Způsob ověření serveru pomocí certifikátu X.509 serveru
Tato ukázka také ukazuje, jak je identita volajícího přístupná ze služby WCF po procesu ověřování vlastního tokenu.
Služba zveřejňuje jeden koncový bod pro komunikaci se službou definovanou pomocí konfiguračního souboru App.config. Koncový bod se skládá z adresy, vazby a kontraktu. Vazba je nakonfigurována pomocí standardního wsHttpBinding s režimem zabezpečení nastaveným na režim zpráv - výchozí režim wsHttpBinding. Tato ukázka nastaví standard wsHttpBinding tak, aby používal ověřování uživatelských jmen klientů. Služba také nakonfiguruje certifikát služby pomocí serviceCredentials chování. Chování securityCredentials umožňuje zadat certifikát služby. Certifikát služby používá klient k ověření služby a poskytnutí ochrany zpráv. Následující konfigurace odkazuje na certifikát localhost nainstalovaný během ukázkové instalace, jak je popsáno v následujících pokynech k instalaci.
<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>
Konfigurace koncového bodu klienta se skládá z názvu konfigurace, absolutní adresy koncového bodu služby, vazby a kontraktu. Konfigurace vazby klienta obsahuje odpovídající Mode a 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>
Implementace klienta nastaví uživatelské jméno a heslo, které se má použít.
static void Main()
{
...
client.ClientCredentials.UserNamePassword.UserName = username;
client.ClientCredentials.UserNamePassword.Password = password;
...
}
Autentizátor vlastních tokenů
Pomocí následujících kroků vytvořte vlastní ověřovací program tokenu:
Napište vlastní ověřovací program tokenu.
Ukázka implementuje vlastní ověřovací program tokenu, který ověří, že uživatelské jméno má platný formát e-mailu. Odvozuje UserNameSecurityTokenAuthenticator. Nejdůležitější metodou v této třídě je ValidateUserNamePasswordCore(String, String). V této metodě authenticator ověří formát uživatelského jména a také, že název hostitele není z neautorizované domény. Pokud jsou splněny obě podmínky, vrátí kolekci IAuthorizationPolicy instancí jen pro čtení, která se pak používá k poskytnutí deklarací identity, které představují informace uložené uvnitř tokenu uživatelského jména.
protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(string userName, string password) { if (!ValidateUserNameFormat(userName)) throw new SecurityTokenValidationException("Incorrect UserName format"); ClaimSet claimSet = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userName, Rights.PossessProperty)); List<IIdentity> identities = new List<IIdentity>(1); identities.Add(new GenericIdentity(userName)); List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1); policies.Add(new UnconditionalPolicy(ClaimSet.System, claimSet, DateTime.MaxValue.ToUniversalTime(), identities)); return policies.AsReadOnly(); }Poskytněte zásadu autorizace vrácenou vlastním autentizátorem tokenů.
Tato ukázka poskytuje vlastní implementaci IAuthorizationPolicy zvanou
UnconditionalPolicy, která vrací sadu deklarací a identit, které byly předány v jejím konstruktoru.class UnconditionalPolicy : IAuthorizationPolicy { String id = Guid.NewGuid().ToString(); ClaimSet issuer; ClaimSet issuance; DateTime expirationTime; IList<IIdentity> identities; public UnconditionalPolicy(ClaimSet issuer, ClaimSet issuance, DateTime expirationTime, IList<IIdentity> identities) { if (issuer == null) throw new ArgumentNullException("issuer"); if (issuance == null) throw new ArgumentNullException("issuance"); this.issuer = issuer; this.issuance = issuance; this.identities = identities; this.expirationTime = expirationTime; } public string Id { get { return this.id; } } public ClaimSet Issuer { get { return this.issuer; } } public DateTime ExpirationTime { get { return this.expirationTime; } } public bool Evaluate(EvaluationContext evaluationContext, ref object state) { evaluationContext.AddToTarget(this, this.issuance); if (this.identities != null) { object value; IList<IIdentity> contextIdentities; if (!evaluationContext.Properties.TryGetValue("Identities", out value)) { contextIdentities = new List<IIdentity>(this.identities.Count); evaluationContext.Properties.Add("Identities", contextIdentities); } else { contextIdentities = value as IList<IIdentity>; } foreach (IIdentity identity in this.identities) { contextIdentities.Add(identity); } } evaluationContext.RecordExpirationTime(this.expirationTime); return true; } }Napište vlastního správce tokenů zabezpečení.
SecurityTokenManager se používá k vytvoření SecurityTokenAuthenticator pro konkrétní SecurityTokenRequirement objekty, které jsou předány v metodě
CreateSecurityTokenAuthenticator. Správce tokenů zabezpečení se používá také k vytváření zprostředkovatelů tokenů a serializátorů tokenů, ale ty nejsou součástí této ukázky. V této ukázce vlastní správce tokenů zabezpečení dědí z ServiceCredentialsSecurityTokenManager třídy a přepíše metoduCreateSecurityTokenAuthenticatorpro vrácení vlastního ověřovacího tokenu uživatelského jména, když předané požadavky na token indikují, že se požaduje ověřovací objekt uživatelského jména.public class MySecurityTokenManager : ServiceCredentialsSecurityTokenManager { MyUserNameCredential myUserNameCredential; public MySecurityTokenManager(MyUserNameCredential myUserNameCredential) : base(myUserNameCredential) { this.myUserNameCredential = myUserNameCredential; } public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) { if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { outOfBandTokenResolver = null; return new MyTokenAuthenticator(); } else { return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } } }Napište vlastní přihlašovací údaje služby.
Třída přihlašovacích údajů služby slouží k reprezentaci přihlašovacích údajů nakonfigurovaných pro službu a vytváří správce bezpečnostních tokenů, který se používá k získání ověřovačů tokenů, zprostředkovatelů tokenů a serializátorů tokenů.
public class MyUserNameCredential : ServiceCredentials { public MyUserNameCredential() : base() { } protected override ServiceCredentials CloneCore() { return new MyUserNameCredential(); } public override SecurityTokenManager CreateSecurityTokenManager() { return new MySecurityTokenManager(this); } }Nakonfigurujte službu tak, aby používala vlastní přihlašovací údaje služby.
Aby služba mohla používat přihlašovací údaje vlastní služby, odstraníme výchozí třídu přihlašovacích údajů služby po zachycení certifikátu služby, který je již předkonfigurovaný ve výchozích přihlašovacích údajích služby, a nakonfigurujeme novou instanci přihlašovacích údajů služby tak, aby používala předkonfigurované certifikáty služby a přidala tuto novou instanci přihlašovacích údajů služby do chování služby.
ServiceCredentials sc = serviceHost.Credentials; X509Certificate2 cert = sc.ServiceCertificate.Certificate; MyUserNameCredential serviceCredential = new MyUserNameCredential(); serviceCredential.ServiceCertificate.Certificate = cert; serviceHost.Description.Behaviors.Remove((typeof(ServiceCredentials))); serviceHost.Description.Behaviors.Add(serviceCredential);
Pokud chcete zobrazit informace volajícího, můžete použít PrimaryIdentity kód, jak je znázorněno v následujícím kódu. Current obsahuje informace o nárocích aktuálního volajícího.
static void DisplayIdentityInformation()
{
Console.WriteLine("\t\tSecurity context identity : {0}",
ServiceSecurityContext.Current.PrimaryIdentity.Name);
return;
}
Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.
Nastavení dávkového souboru
Dávkový soubor Setup.bat, který je součástí této ukázky, umožňuje nakonfigurovat server s relevantními certifikáty pro spuštění aplikace v místním prostředí, která vyžaduje zabezpečení založené na certifikátech serveru. Tento dávkový soubor musí být upraven tak, aby fungoval v počítačích nebo aby fungoval v případě, že není hostovaný.
Následuje stručný přehled různých částí dávkových souborů, aby je bylo možné upravit tak, aby běžely v příslušné konfiguraci.
Vytvoření certifikátu serveru
Následující řádky z dávkového souboru Setup.bat vytvoří certifikát serveru, který se má použít. Proměnná
%SERVER_NAME%určuje název serveru. Změňte tuto proměnnou tak, aby byla zadána vlastní název serveru. Výchozí hodnota v tomto dávkovém souboru je 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 -peInstalace certifikátu serveru do důvěryhodného úložiště certifikátů klienta
Následující řádky v dávkovém souboru Setup.bat zkopírují certifikát serveru do úložiště důvěryhodných lidí klienta. Tento krok je povinný, protože certifikáty generované Makecert.exe nejsou implicitně důvěryhodné klientským systémem. Pokud už máte certifikát, který je kořenový v kořenovém certifikátu klienta ( například certifikát vydaný Microsoftem), tento krok naplnění úložiště klientských certifikátů certifikátem pomocí certifikátu serveru se nevyžaduje.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeoplePoznámka:
Dávkový soubor instalačního programu je navržený tak, aby běžel z příkazového řádku sady Windows SDK. Vyžaduje, aby proměnná prostředí MSSDK odkazovala na adresář, ve kterém je sada SDK nainstalovaná. Tato proměnná prostředí se automaticky nastaví v příkazovém řádku prostředí Windows SDK.
Nastavení a sestavení ukázky
Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.
Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Spustit ukázku na stejném počítači
Spusťte Setup.bat z ukázkové instalační složky v příkazovém řádku sady Visual Studio otevřeného s oprávněními správce. Tím se nainstalují všechny certifikáty potřebné pro spuštění ukázky.
Poznámka:
Dávkový soubor Setup.bat je navržený tak, aby běžel z příkazového řádku sady Visual Studio. Proměnná prostředí PATH nastavená v příkazovém řádku sady Visual Studio odkazuje na adresář, který obsahuje spustitelné soubory vyžadované skriptem Setup.bat.
Spusťte service.exe ze služby\bin.
Spusťte client.exe z \client\bin. Aktivita klienta se zobrazí v aplikaci konzoly klienta.
Pokud klient a služba nemůžou komunikovat, přečtěte si Tipy pro řešení potíží v ukázkách WCF.
Spustit ukázku na více počítačích
Vytvořte adresář na počítači služby pro binární soubory služby.
Zkopírujte soubory programu služby do adresáře služby v počítači služby. Zkopírujte také soubory Setup.bat a Cleanup.bat do počítače služby.
Musíte mít certifikát serveru s názvem subjektu, který obsahuje plně kvalifikovaný název domény počítače. Soubor App.config služby musí být aktualizován tak, aby odrážel tento nový název certifikátu. Můžete ho vytvořit pomocí Setup.bat, pokud proměnnou nastavíte
%SERVER_NAME%na plně kvalifikovaný název hostitele počítače, na kterém bude služba spuštěna. Všimněte si, že soubor setup.bat se musí spustit z příkazového řádku pro vývojáře pro Visual Studio otevřené s oprávněními správce.Zkopírujte certifikát serveru do CurrentUser-TrustedPeople úložiště klienta. Nemusíte to dělat, s výjimkou případů, kdy certifikát serveru vydává důvěryhodný vystavitel klienta.
V souboru App.config na počítači služby změňte hodnotu základní adresy tak, aby místo localhost zadal plně kvalifikovaný název počítače.
Na počítači služby spusťte service.exe z příkazového řádku.
Zkopírujte soubory klientského programu ze složky \client\bin\ ve složce specifické pro jazyk do klientského počítače.
V souboru Client.exe.config na klientském počítači změňte hodnotu adresy koncového bodu tak, aby odpovídala nové adrese vaší služby.
Na klientském počítači spusťte Client.exe z příkazového řádku.
Pokud klient a služba nemůžou komunikovat, přečtěte si Tipy pro řešení potíží v ukázkách WCF.
Úklid po vzorku
- Po dokončení spuštění ukázky spusťte Cleanup.bat ve složce s ukázkami.