Zabezpečení zpráv s uživatelským jménem
Tato ukázka ukazuje, jak implementovat aplikaci, která používá WS-Security s ověřováním uživatelského jména pro klienta a vyžaduje ověření serveru pomocí certifikátu X.509v3 serveru. Všechny zprávy aplikace mezi klientem a serverem jsou podepsané a šifrované. Ve výchozím nastavení se uživatelské jméno a heslo zadané klientem používají k přihlášení k platnému účtu Systému Windows. Tato ukázka je založená na WSHttpBindingu. Tato ukázka se skládá z programu konzoly klienta (Client.exe) a knihovny služeb (Service.dll) hostované službou Internetová informační služba (IIS). Služba implementuje kontrakt, který definuje komunikační vzor žádosti a odpovědi.
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Tato ukázka také ukazuje:
Výchozí mapování na účty Systému Windows, aby bylo možné provést další autorizaci.
Přístup k informacím o identitě volajícího z kódu služby
Služba zveřejňuje jeden koncový bod pro komunikaci se službou, která je definovaná pomocí konfiguračního souboru Web.config. Koncový bod se skládá z adresy, vazby a kontraktu. Vazba je nakonfigurována se standardním <wsHttpBinding>, který ve výchozím nastavení používá zabezpečení zpráv. Tato ukázka nastaví standardní <wsHttpBinding> tak, aby používala ověřování pomocí uživatelského jména klienta. Chování určuje, že se přihlašovací údaje uživatele použijí k ověřování služby. Certifikát serveru musí obsahovat stejnou hodnotu pro název subjektu jako findValue
atribut v <serviceCredentials>.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
By default, Username authentication attempts to authenticate the provided
username as a Windows computer or domain account.
-->
<binding>
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to the client and to 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>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Konfigurace koncového bodu klienta se skládá z absolutní adresy koncového bodu služby, vazby a kontraktu. Vazba klienta je nakonfigurována s odpovídajícími securityMode
a authenticationMode
. Při spuštění ve scénáři mezi počítači je potřeba odpovídajícím způsobem změnit adresu koncového bodu služby.
<system.serviceModel>
<client>
<endpoint address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCredentialsBehavior"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
-->
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<endpointBehaviors>
<behavior name="ClientCredentialsBehavior">
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it is trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Implementace klienta nastaví uživatelské jméno a heslo, které se má použít.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Configure client with valid computer or domain account (username,password).
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();
// Call GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
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.
MyMachine\TestAccount
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
Dávkový soubor Setup.bat, který je součástí ukázek MessageSecurity, umožňuje nakonfigurovat server s příslušným certifikátem pro spuštění hostované aplikace, která vyžaduje zabezpečení založené na certifikátech. Dávkový soubor lze spustit ve dvou režimech. Chcete-li spustit dávkový soubor v režimu jednoho počítače, zadejte setup.bat
na příkazovém řádku. Chcete-li jej spustit v režimu služby typu setup.bat service
. Tento režim použijete při spuštění ukázky napříč počítači. Podrobnosti najdete v postupu nastavení na konci tohoto tématu.
Níže najdete stručný přehled různých částí dávkových souborů.
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.
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
Proměnná %SERVER_NAME% určuje název serveru. Certifikát je uložen v úložišti LocalMachine. Pokud je dávkový soubor Setup.bat spuštěn s argumentem služby (například
setup.bat service
) %SERVER_NAME% obsahuje plně kvalifikovaný název domény počítače. Jinak se výchozí hodnota nastaví na localhost.Instalace certifikátu serveru do důvěryhodného úložiště certifikátů klienta
Následující řádek zkopíruje certifikát serveru do úložiště důvěryhodných osob 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 TrustedPeople
Udělení oprávnění k privátnímu klíči certifikátu
Následující řádky v dávkovém souboru Setup.bat vytvoří certifikát serveru uložený v úložišti LocalMachine přístupný pro účet pracovního procesu ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Poznámka:
Pokud používáte jiné uživatele než USA. Anglickou edici Systému Windows musíte upravit soubor Setup.bat a nahradit
NT AUTHORITY\NETWORK SERVICE
název účtu místním ekvivalentem.
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.
Spuštění ukázky na stejném počítači
Ujistěte se, že cesta obsahuje složku, ve které jsou umístěné Makecert.exe a FindPrivateKey.exe.
Spusťte Setup.bat z ukázkové instalační složky v příkazovém řádku pro vývojáře pro Visual Studio otevřené 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 pro vývojáře pro Visual Studio. Vyžaduje, aby proměnná prostředí cesty ukazovala na adresář, ve kterém je sada SDK nainstalovaná. Tato proměnná prostředí se automaticky nastaví v rámci příkazového řádku pro vývojáře pro Visual Studio.
Zadáním adresy
http://localhost/servicemodelsamples/service.svc
ověřte přístup ke službě pomocí prohlížeče.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 téma Řešení potíží Tipy pro ukázky WCF.
Spuštění ukázky napříč počítači
Vytvořte adresář na počítači služby. Pomocí nástroje pro správu Internetová informační služba vytvořte virtuální aplikaci s názvem servicemodelsamples pro tento adresář.
Zkopírujte soubory programu služby z \inetpub\wwwroot\servicemodelsamples do virtuálního adresáře v počítači služby. Ujistěte se, že kopírujete soubory v podadresáři \bin. Zkopírujte také soubory Setup.bat a Cleanup.bat do počítače služby.
Vytvořte adresář v klientském počítači pro binární soubory klienta.
Zkopírujte soubory klientského programu do klientského adresáře v klientském počítači. Zkopírujte také soubory Setup.bat, Cleanup.bat a ImportServiceCert.bat do klienta.
Na serveru spusťte
setup.bat service
příkazový řádek pro vývojáře pro Visual Studio otevřený s oprávněními správce. Spuštěnísetup.bat
s argumentemservice
vytvoří certifikát služby s plně kvalifikovaným názvem domény počítače a exportuje certifikát služby do souboru s názvem Service.cer.Upravte web.config tak, aby odrážel nový název certifikátu (v atributu findValue v elementu serviceCertificate), který je stejný jako plně kvalifikovaný název domény počítače.
.
Zkopírujte soubor Service.cer z adresáře služby do klientského adresáře v klientském počítači.
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 klientovi spusťte ImportServiceCert.bat v příkazovém řádku pro vývojáře pro Visual Studio otevřené s oprávněními správce. Tím se certifikát služby naimportuje ze souboru Service.cer do úložiště CurrentUser – Trusted Lidé.
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 téma Řešení potíží Tipy pro ukázky WCF.
Vyčištění po ukázce
Po dokončení spuštění ukázky spusťte Cleanup.bat ve složce s ukázkami.
Poznámka:
Tento skript při spuštění této ukázky na počítačích neodebere certifikáty služby v klientovi. Pokud jste spustili ukázky wcf (Windows Communication Foundation), které používají certifikáty napříč počítači, nezapomeňte vymazat certifikáty služby nainstalované v úložišti CurrentUser – Trusted Lidé. K tomu použijte následující příkaz:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Například:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.