Identita a ověřování služby
Identita koncového bodu služby je hodnota vygenerovaná z jazyka WSDL (Web Services Description Language). Tato hodnota, která se rozšíří do libovolného klienta, se používá k ověření služby. Jakmile klient zahájí komunikaci s koncovým bodem a služba se ověří vůči klientovi, porovná hodnotu identity koncového bodu se skutečnou hodnotou vrácenou procesem ověřování koncového bodu. Pokud se shodují, klient si je jistý, že kontaktoval očekávaný koncový bod služby. Funguje jako ochrana před útoky phishing tím, že brání klientovi v přesměrování na koncový bod hostovaný škodlivou službou.
Ukázková aplikace, která demonstruje nastavení identity, najdete v části Ukázka identity služby. Další informace o koncových bodech a adresách koncových bodů najdete v tématu Adresy.
Poznámka:
Při použití NT LanMan (NTLM) pro ověřování není identita služby kontrolována, protože v části NTLM klient nemůže ověřit server. NTLM se používá, pokud jsou počítače součástí pracovní skupiny systému Windows nebo při spuštění starší verze systému Windows, která nepodporuje ověřování protokolem Kerberos.
Když klient zahájí zabezpečený kanál pro odeslání zprávy službě, ověří se infrastruktura wcf (Windows Communication Foundation) a odešle zprávu pouze v případě, že identita služby odpovídá identitě zadané v adrese koncového bodu, kterou klient používá.
Zpracování identit se skládá z následujících fází:
V době návrhu určuje vývojář klienta identitu služby z metadat koncového bodu (vystavených prostřednictvím WSDL).
V době běhu klientská aplikace zkontroluje deklarace identity přihlašovacích údajů zabezpečení služby před odesláním všech zpráv do služby.
Zpracování identity na klientovi je podobné ověřování klientů ve službě. Zabezpečená služba nespustí kód, dokud se neověří přihlašovací údaje klienta. Podobně klient neodesílá zprávy do služby, dokud nebudou přihlašovací údaje služby ověřeny na základě toho, co je známo předem z metadat služby.
Vlastnost Identity EndpointAddress třídy představuje identitu služby volanou klientem. Služba publikuje Identity ve svých metadatech. Když vývojář klienta spustí nástroj ServiceModel Metadata Utility (Svcutil.exe) pro koncový bod služby, vygenerovaná konfigurace obsahuje hodnotu vlastnosti služby Identity . Infrastruktura WCF (pokud je nakonfigurovaná se zabezpečením) ověřuje, že služba má zadanou identitu.
Důležité
Metadata obsahují očekávanou identitu služby, takže doporučujeme, abyste metadata služby zpřístupnili zabezpečenými prostředky, například vytvořením koncového bodu HTTPS pro službu. Další informace najdete v tématu Postupy: Zabezpečení koncových bodů metadat.
Typy identit
Služba může poskytovat šest typů identit. Každý typ identity odpovídá elementu, který může být obsažen uvnitř elementu <identity>
v konfiguraci. Použitý typ závisí na scénáři a požadavcích na zabezpečení služby. Následující tabulka popisuje jednotlivé typy identit.
Typ identity | Popis | Typický scénář |
---|---|---|
DNS (Domain Name System) | Tento prvek použijte s certifikáty X.509 nebo účty Systému Windows. Porovná název DNS zadaný v přihlašovacích údajích s hodnotou zadanou v tomto prvku. | Kontrola DNS umožňuje používat certifikáty s názvy DNS nebo subjektu. Pokud se certifikát znovu spustí se stejným názvem DNS nebo subjektu, bude kontrola identity stále platná. Když se certifikát znovu vytvoří, získá nový klíč RSA, ale zachová stejný název DNS nebo subjektu. To znamená, že klienti nemusí aktualizovat informace o identitě služby. |
Certifikát. Výchozí hodnota je nastavená ClientCredentialType na Certifikát. |
Tento prvek určuje hodnotu certifikátu X.509 s kódováním Base64, která se má porovnat s klientem. Tento element také použijte při použití CardSpace jako přihlašovacích údajů k ověření služby. |
Tento element omezuje ověřování na jeden certifikát na základě jeho hodnoty kryptografického otisku. To umožňuje přísnější ověřování, protože hodnoty kryptografického otisku jsou jedinečné. To má jednu výstrahu: Pokud se certifikát znovu vytvoří se stejným názvem subjektu, má také nový kryptografický otisk. Klienti proto nemůžou službu ověřit, pokud není znám nový kryptografický otisk. Další informace o vyhledání kryptografického otisku certifikátu naleznete v tématu Postupy: Načtení kryptografického otisku certifikátu. |
Referenční informace o certifikátu | Stejné jako u možnosti Certifikátu popsané výše. Tento prvek však umožňuje zadat název certifikátu a umístění úložiště, ze kterého se má certifikát načíst. | Stejné jako u výše popsaného scénáře certifikátu. Výhodou je, že umístění úložiště certifikátů se může změnit. |
RSA | Tento prvek určuje hodnotu klíče RSA, která se má porovnat s klientem. Podobá se možnosti certifikátu, ale místo použití kryptografického otisku certifikátu se místo toho použije klíč RSA certifikátu. | Kontrola RSA umožňuje konkrétně omezit ověřování na jeden certifikát založený na jeho klíči RSA. To umožňuje přísnější ověřování konkrétního klíče RSA na úkor služby, která už nefunguje se stávajícími klienty, pokud se hodnota klíče RSA změní. |
Hlavní název uživatele (UPN). Výchozí hodnota, pokud je nastavena ClientCredentialType na Windows a proces služby není spuštěný v rámci jednoho ze systémových účtů. |
Tento prvek určuje hlavní název uživatele (UPN), pod kterým je služba spuštěná. Viz část Protokol Kerberos a identita přepsání identity služby pro ověřování. | Tím se zajistí, že služba běží pod konkrétním uživatelským účtem Systému Windows. Uživatelským účtem může být aktuální přihlášený uživatel nebo služba spuštěná pod konkrétním uživatelským účtem. Toto nastavení využívá zabezpečení protokolu Kerberos systému Windows, pokud je služba spuštěná v rámci účtu domény v prostředí služby Active Directory. |
Hlavní název služby (SPN). Výchozí hodnota, pokud je nastavená ClientCredentialType na Windows a proces služby běží v rámci jednoho ze systémových účtů – LocalService, LocalSystem nebo NetworkService. |
Tento element určuje hlavní název služby (SPN) přidružený k účtu služby. Viz část Protokol Kerberos a identita přepsání identity služby pro ověřování. | Tím se zajistí, že hlavní název služby (SPN) a konkrétní účet systému Windows přidružený k hlavnímu názvu služby identifikuje službu. Pomocí nástroje Setspn.exe můžete přidružit účet počítače k uživatelskému účtu služby. Toto nastavení využívá zabezpečení protokolu Kerberos systému Windows, pokud je služba spuštěná pod jedním ze systémových účtů nebo pod účtem domény, který má přidružený název hlavního názvu služby (SPN) a počítač je členem domény v prostředí služby Active Directory. |
Určení identity ve službě
Obvykle není nutné nastavit identitu ve službě, protože výběr typu přihlašovacích údajů klienta určuje typ identity vystavený v metadatech služby. Další informace o přepsání nebo určení identity služby naleznete v tématu Přepsání identity služby pro ověřování.
Použití elementu <identity> v konfiguraci
Pokud změníte typ přihlašovacích údajů klienta v dříve zobrazené Certificate
vazbě na , generovaný WSDL obsahuje serializovaný certifikát X.509 Base64 pro hodnotu identity, jak je znázorněno v následujícím kódu. Toto je výchozí hodnota pro všechny jiné typy přihlašovacích údajů klienta než Windows.
Hodnotu výchozí identity služby můžete změnit nebo změnit typ identity pomocí elementu <identity>
v konfiguraci nebo nastavením identity v kódu. Následující konfigurační kód nastaví identitu DNS (Domain Name System) s hodnotou contoso.com
.
Programové nastavení identity
Vaše služba nemusí explicitně zadávat identitu, protože WCF ji automaticky určí. WCF však umožňuje v případě potřeby zadat identitu v koncovém bodu. Následující kód přidá nový koncový bod služby s konkrétní identitou DNS.
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
Určení identity v klientovi
Vývojář klienta v době návrhu obvykle ke generování konfigurace klienta používá nástroj ServiceModel Metadata Utility (Svcutil.exe). Vygenerovaný konfigurační soubor (určený pro použití klientem) obsahuje identitu serveru. Například následující kód se vygeneruje ze služby, která určuje identitu DNS, jak je znázorněno v předchozím příkladu. Všimněte si, že hodnota identity koncového bodu klienta odpovídá hodnotě identity koncového bodu klienta. V tomto případě, když klient obdrží přihlašovací údaje systému Windows (Kerberos) pro službu, očekává, že hodnota bude contoso.com
.
Pokud služba místo Systému Windows jako typ přihlašovacích údajů klienta určuje certifikát, očekává se, že jeho vlastnost DNS bude hodnotou contoso.com
. (Nebo pokud je null
vlastnost DNS , název subjektu certifikátu musí být contoso.com
.)
Použití konkrétní hodnoty pro identitu
Následující konfigurační soubor klienta ukazuje, jak se očekává, že identita služby bude konkrétní hodnotou. V následujícím příkladu může klient komunikovat se dvěma koncovými body. První je identifikován kryptografický otisk certifikátu a druhý s klíčem RSA certifikátu. To znamená, že certifikát, který obsahuje pouze pár veřejného klíče nebo privátního klíče, ale není vydaný důvěryhodnou autoritou.
Kontrola identity za běhu
V době návrhu určuje vývojář klienta identitu serveru prostřednictvím jeho metadat. V době běhu se kontrola identity provede před voláním jakýchkoli koncových bodů ve službě.
Hodnota identity je svázaná s typem ověřování určeným metadaty; Jinými slovy, typ přihlašovacích údajů používaných pro službu.
Pokud je kanál nakonfigurovaný tak, aby se ověřil pomocí protokolu SSL (Message- nebo transport-level Secure Sockets Layer) s certifikáty X.509 pro ověřování, jsou platné následující hodnoty identity:
DNS. WCF zajišťuje, že certifikát poskytnutý během metody handshake SSL obsahuje atribut DNS nebo
CommonName
(CN) se rovná hodnotě zadané v identitě DNS v klientovi. Všimněte si, že tyto kontroly se provádějí spolu s určením platnosti certifikátu serveru. Wcf ve výchozím nastavení ověří, že certifikát serveru vydává důvěryhodná kořenová autorita.Certifikát. Během metody handshake PROTOKOLU SSL WCF zajišťuje, aby vzdálený koncový bod poskytoval přesnou hodnotu certifikátu zadanou v identitě.
Referenční informace o certifikátu. Stejné jako certifikát.
RSA. Během metody handshake PROTOKOLU SSL WCF zajišťuje, aby vzdálený koncový bod poskytoval přesný klíč RSA zadaný v identitě.
Pokud se služba ověřuje pomocí protokolu SSL na úrovni zpráv nebo přenosu s přihlašovacími údaji systému Windows pro ověřování a vyjedná přihlašovací údaje, jsou platné následující hodnoty identity:
DNS. Vyjednávání předává hlavní název služby (SPN) služby, aby bylo možné zkontrolovat název DNS. Hlavní název služby je ve formátu
host/<dns name>
.Hlavní název služby (SPN) Je vrácen explicitní hlavní název služby, například
host/myservice
.Hlavní názvu uživatele (UPN). Hlavní název uživatele (UPN) účtu služby. Hlavní název uživatele (UPN) je ve formátu
username
@domain
. Například když je služba spuštěná v uživatelském účtu, může to býtusername@contoso.com
.
Zadání identity prostřednictvím kódu programu (pomocí Identity vlastnosti) je volitelné. Pokud není zadána žádná identita a typ přihlašovacích údajů klienta je Windows, výchozí je hlavní název služby (SPN) s hodnotou nastavenou na část názvu hostitele adresy koncového bodu služby s předponou "host/" literálem. Pokud není zadána žádná identita a typ přihlašovacích údajů klienta je certifikát, výchozí hodnota je Certificate
. To platí pro zabezpečení na úrovni zpráv i přenosu.
Identity a vlastní vazby
Vzhledem k tomu, že identita služby závisí na použitém typu vazby, ujistěte se, že se při vytváření vlastní vazby zobrazí příslušná identita. Například v následujícím příkladu kódu není vystavená identita kompatibilní s typem zabezpečení, protože identita pro zabezpečenou vazbu bootstrap konverzace neodpovídá identitě pro vazbu v koncovém bodu. Zabezpečená vazba konverzace nastaví identitu DNS, zatímco hlavní název uživatele (UPN) nebo identitu hlavního WindowsStreamSecurityBindingElement názvu služby (SPN).
CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
CreateSecureConversationBindingElement(
SecurityBindingElement.
CreateIssuedTokenForSslBindingElement(
new IssuedSecurityTokenParameters())));
// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());
Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))
' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())
Další informace o tom, jak správně naskládat prvky vazby pro vlastní vazbu, naleznete v tématu Vytváření uživatelem definovaných vazeb. Další informace o vytvoření vlastní vazby pomocí SecurityBindingElement, naleznete v tématu Postupy: Vytvoření SecurityBindingElement pro zadaný režim ověřování.
Viz také
- Postupy: Vytvoření vlastní vazby pomocí SecurityBindingElement
- Postupy: Vytvoření SecurityBindingElement pro zadaný režim ověřování
- Postupy: Vytvoření vlastního ověřovatele identity klientů
- Výběr typu přihlašovacích údajů
- Práce s certifikáty
- Nástroj metadat modelu služby (Svcutil.exe)
- Vytváření uživatelem definovaných vazeb
- Postupy: Načtení kryptografického otisku certifikátu