Beveiligingsgedrag in WCF
In Windows Communication Foundation (WCF) wijzigt het gedrag van de runtime op serviceniveau of op eindpuntniveau. (Zie voor meer informatie over gedrag in het algemeen Runtimegedrag van de service opgeven.) Beveiligingsgedrag staat controle toe over referenties, verificatie, autorisatie en controlelogboeken. U kunt gedrag gebruiken door te programmeren of via configuratie.
Dit artikel is gericht op het configureren van het volgende gedrag met betrekking tot beveiligingsfuncties:
- <serviceCredentials>
- <clientCredentials>
- <serviceAuthorization>
- <serviceSecurityAudit>
- <serviceMetadata>, waarmee u ook een beveiligd eindpunt kunt opgeven waartoe clients toegang hebben voor metagegevens
Referenties instellen met gedrag
Gebruik de <serviceCredentials> en <clientCredentials> om referentiewaarden in te stellen voor een service of client. De onderliggende bindingsconfiguratie bepaalt of een referentie moet worden ingesteld. Als de beveiligingsmodus bijvoorbeeld is ingesteld op None
, verifiëren zowel clients als services elkaar niet en vereisen ze geen referenties van elk type.
Aan de andere kant kan de servicebinding een clientreferentietype vereisen. In dat geval moet u mogelijk een referentiewaarde instellen met behulp van een gedrag. (Zie voor meer informatie over de mogelijke typen referenties Een referentietype selecteren.) In sommige gevallen, zoals wanneer Windows-referenties worden gebruikt om te verifiëren, wordt in de omgeving automatisch de werkelijke referentiewaarde vastgelegd en hoeft u de referentiewaarde niet expliciet in te stellen (tenzij u een andere set referenties wilt opgeven).
Alle servicereferenties worden gevonden als onderliggende elementen van de <serviceBehaviors>. In het volgende voorbeeld ziet u een certificaat dat wordt gebruikt als servicereferentie.
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior1">
<serviceCredentials>
<serviceCertificate findValue="000000000000000000000000000"
storeLocation="CurrentUser"
storeName="Root" x509FindType="FindByThumbprint" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Servicereferenties
De <serviceCredentials> bevat vier onderliggende elementen. De elementen en het bijbehorende gebruik worden in de volgende secties besproken.
<serviceCertificate-element>
Gebruik dit element om een X.509-certificaat op te geven dat wordt gebruikt om de service te verifiëren bij clients met de berichtbeveiligingsmodus. Als u een certificaat gebruikt dat periodiek wordt vernieuwd, wordt de vingerafdruk gewijzigd. Gebruik in dat geval de onderwerpnaam als de X509FindType
naam omdat het certificaat opnieuw kan worden uitgegeven met dezelfde onderwerpnaam.
Zie Voor meer informatie over het gebruik van het element: Clientreferentiewaarden opgeven.
<certificaat> van <clientCertificate-element>
Gebruik het <certificaatelement> wanneer de service het certificaat van de client van tevoren moet hebben om veilig met de client te communiceren. Dit gebeurt wanneer u het dubbelzijdige communicatiepatroon gebruikt. In het meer typische aanvraagantwoordpatroon bevat de client het certificaat in de aanvraag, die de service gebruikt om het antwoord terug te beveiligen naar de client. Het dubbelzijdige communicatiepatroon heeft echter geen aanvragen en antwoorden. De service kan het certificaat van de client niet afleiden uit de communicatie en daarom vereist de service het certificaat van de client vooraf om de berichten naar de client te beveiligen. U moet het certificaat van de client verkrijgen op een out-of-band-manier en het certificaat opgeven met behulp van dit element. Zie How to: Create a Duplex Contract (Een duplexcontract maken) voor meer informatie over duplexservices.
<verificatie> van <clientCertificate-element>
<Met het verificatieelement> kunt u aanpassen hoe clients worden geverifieerd. U kunt het CertificateValidationMode
kenmerk instellen op None
, ChainTrust
, PeerOrChainTrust
of PeerTrust
Custom
. Standaard is het niveau ingesteld op ChainTrust
, waarmee wordt aangegeven dat elk certificaat moet worden gevonden in een hiërarchie van certificaten die eindigen op een basisinstantie boven aan de keten. Dit is de veiligste modus. U kunt ook de waarde PeerOrChainTrust
instellen op , waarmee wordt aangegeven dat zelf uitgegeven certificaten (peer trust) worden geaccepteerd, evenals certificaten die zich in een vertrouwde keten bevinden. Deze waarde wordt gebruikt bij het ontwikkelen en opsporen van fouten in clients en services, omdat zelf uitgegeven certificaten niet hoeven te worden aangeschaft bij een vertrouwde instantie. Wanneer u een client implementeert, gebruikt u in plaats daarvan de ChainTrust
waarde. U kunt de waarde ook instellen op Custom
. Wanneer deze Custom
waarde is ingesteld, moet u ook het CustomCertificateValidatorType
kenmerk instellen op een assembly en het type dat wordt gebruikt om het certificaat te valideren. Als u uw eigen aangepaste validator wilt maken, moet u overnemen van de abstracte X509CertificateValidator klasse.
<het element issuedTokenAuthentication>
Het uitgegeven tokenscenario heeft drie fasen. In de eerste fase verwijst een client die toegang probeert te krijgen tot een service een beveiligde tokenservice (STS). De STS verifieert vervolgens de client en geeft vervolgens een token van de client uit, meestal een SAML-token (Security Assertions Markup Language). De client keert vervolgens terug naar de service met het token. De service onderzoekt het token voor gegevens waarmee de service het token en daarom de client kan verifiëren. Als u het token wilt verifiëren, moet het certificaat dat de beveiligde tokenservice gebruikt, bekend zijn bij de service. Het <element issuedTokenAuthentication> is de opslagplaats voor dergelijke beveiligde tokenservicecertificaten. Als u certificaten wilt toevoegen, gebruikt u de bekendeCertificates>.< Voeg een <add in> voor elk certificaat, zoals wordt weergegeven in het volgende voorbeeld.
<issuedTokenAuthentication>
<knownCertificates>
<add findValue="www.contoso.com"
storeLocation="LocalMachine" storeName="My"
X509FindType="FindBySubjectName" />
</knownCertificates>
</issuedTokenAuthentication>
Standaard moeten de certificaten worden verkregen van een beveiligde tokenservice. Deze 'bekende' certificaten zorgen ervoor dat alleen legitieme clients toegang hebben tot een service.
U moet de verzameling allowedAudienceUris gebruiken in een federatieve toepassing die gebruikmaakt van een beveiligde tokenservice (STS) die beveiligingstokens> uitgeeftSamlSecurityToken
.< Wanneer de STS het beveiligingstoken uitgeeft, kan het de URI opgeven van de webservices waarvoor het beveiligingstoken is bedoeld door een SamlAudienceRestrictionCondition
aan het beveiligingstoken toe te voegen. Hiermee kan de SamlSecurityTokenAuthenticator
geadresseerde webservice controleren of het uitgegeven beveiligingstoken is bedoeld voor deze webservice door op te geven dat deze controle moet plaatsvinden door het volgende te doen:
Stel het
audienceUriMode
kenmerk <van issuedTokenAuthentication in op>Always
of .BearerKeyOnly
Geef de set geldige URI's op door de URI's toe te voegen aan deze verzameling. Hiervoor voegt u een <add> in voor elke URI
Zie SamlSecurityTokenAuthenticator voor meer informatie.
Zie Referenties configureren voor een Federation-service voor meer informatie over het gebruik van dit configuratie-element.
Anonieme cardspacegebruikers toestaan
Door het AllowUntrustedRsaIssuers
kenmerk van het <IssuedTokenAuthentication>
element zo in te true
stellen dat elke client expliciet een zelf uitgegeven token kan presenteren dat is ondertekend met een willekeurig RSA-sleutelpaar. De verlener is niet vertrouwd omdat aan de sleutel geen verlenergegevens zijn gekoppeld. Een CardSpace-gebruiker kan een zelf uitgegeven kaart maken die zelf opgegeven claims van identiteit bevat. Gebruik deze mogelijkheid met voorzichtigheid. Als u deze functie wilt gebruiken, moet u de openbare RSA-sleutel beschouwen als een veiliger wachtwoord dat samen met een gebruikersnaam moet worden opgeslagen in een database. Voordat u een clienttoegang tot de service toestaat, controleert u de door de client gepresenteerde openbare RSA-sleutel door deze te vergelijken met de opgeslagen openbare sleutel voor de gepresenteerde gebruikersnaam. Hierbij wordt ervan uitgegaan dat u een registratieproces hebt ingesteld waarbij gebruikers hun gebruikersnamen kunnen registreren en aan de zelf uitgegeven RSA-openbare sleutels kunnen koppelen.
Clientreferenties
Clientreferenties worden gebruikt om de client te verifiëren bij services in gevallen waarin wederzijdse verificatie vereist is. U kunt de sectie gebruiken om servicecertificaten op te geven voor scenario's waarin de client berichten naar een service met het certificaat van de service moet beveiligen.
U kunt een client ook configureren als onderdeel van een federatiescenario voor het gebruik van uitgegeven tokens van een beveiligde tokenservice of een lokale verlener van tokens. Zie Federatie- en uitgegeven tokens voor meer informatie over federatieve scenario's. Alle clientreferenties worden gevonden onder endpointBehaviors><, zoals wordt weergegeven in de volgende code.
<behaviors>
<endpointBehaviors>
<behavior name="EndpointBehavior1">
<clientCredentials>
<clientCertificate findValue="cn=www.contoso.com"
storeLocation="LocalMachine"
storeName="AuthRoot" x509FindType="FindBySubjectName" />
<serviceCertificate>
<defaultCertificate findValue="www.cohowinery.com"
storeLocation="LocalMachine"
storeName="Root" x509FindType="FindByIssuerName" />
<authentication revocationMode="Online"
trustedStoreLocation="LocalMachine" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<clientCertificate-element>
Stel het certificaat in dat wordt gebruikt om de client te verifiëren met dit element. Zie Voor meer informatie : Clientreferentiewaarden opgeven.
<httpDigest>
Deze functie moet zijn ingeschakeld met Active Directory in Windows en Internet Information Services (IIS). Zie Digest Authentication in IIS 6.0 voor meer informatie.
<het element issuedToken>
Het <uitgegevenToken> bevat de elementen die worden gebruikt voor het configureren van een lokale verlener van tokens of gedrag dat wordt gebruikt met een beveiligingstokenservice. Zie Instructies voor het configureren van een client voor het gebruik van een lokale verlener : Een lokale verlener configureren.
<localIssuerAddress>
Hiermee geeft u een standaardserviceadres voor beveiligingstokens op. Dit wordt gebruikt wanneer er WSFederationHttpBinding geen URL wordt opgegeven voor de beveiligingstokenservice, of wanneer het adres van de uitgever van een federatieve binding is http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous
of null
. In dergelijke gevallen moet het ClientCredentials worden geconfigureerd met het adres van de lokale verlener en de binding die moet worden gebruikt om met die verlener te communiceren.
<issuerChannelBehaviors>
Gebruik de <issuerChannelBehaviors> om WCF-clientgedrag toe te voegen dat wordt gebruikt bij het communiceren met een beveiligingstokenservice. Definieer clientgedrag in de sectie endpointBehaviors>.< Als u een gedefinieerd gedrag wilt gebruiken, voegt u een <add>
element toe aan het <issuerChannelBehaviors>
element met twee kenmerken. Stel de issuerAddress
URL van de beveiligingstokenservice in en stel het behaviorConfiguration
kenmerk in op de naam van het gedefinieerde eindpuntgedrag, zoals wordt weergegeven in het volgende voorbeeld.
<clientCredentials>
<issuedToken>
<issuerChannelBehaviors>
<add issuerAddress="http://www.contoso.com"
behaviorConfiguration="clientBehavior1" />
</issuerChannelBehaviors>
</issuedToken>
</clientCredentials>
<serviceCertificate-element>
Gebruik dit element om de verificatie van servicecertificaten te beheren.
Het <element defaultCertificate> kan één certificaat opslaan dat wordt gebruikt wanneer de service geen certificaat opgeeft.
Gebruik de <scopedCertificates> en <voeg deze toe> om servicecertificaten in te stellen die zijn gekoppeld aan specifieke services. Het <add>
element bevat een targetUri
kenmerk dat wordt gebruikt om het certificaat aan de service te koppelen.
Het <verificatieelement> geeft het vertrouwensniveau aan dat wordt gebruikt voor het verifiëren van certificaten. Standaard is het niveau ingesteld op ChainTrust, waarmee wordt aangegeven dat elk certificaat moet worden gevonden in een hiërarchie van certificaten die eindigen op een vertrouwde certificeringsinstantie boven aan de keten. Dit is de veiligste modus. U kunt ook de waarde instellen op PeerOrChainTrust, waarmee wordt aangegeven dat zelf-uitgegeven certificaten (peer trust) worden geaccepteerd, evenals certificaten die zich in een vertrouwde keten bevinden. Deze waarde wordt gebruikt bij het ontwikkelen en opsporen van fouten in clients en services, omdat zelf uitgegeven certificaten niet hoeven te worden aangeschaft bij een vertrouwde instantie. Wanneer u een client implementeert, gebruikt u in plaats daarvan de waarde 'ChainTrust'. U kunt de waarde ook instellen op 'Aangepast' of 'Geen'. Als u de waarde 'Aangepast' wilt gebruiken, moet u ook het CustomCertificateValidatorType
kenmerk instellen op een assembly en het type dat wordt gebruikt om het certificaat te valideren. Als u uw eigen aangepaste validator wilt maken, moet u overnemen van de abstracte X509CertificateValidator klasse. Zie Instructies voor meer informatie : Een service maken die gebruikmaakt van een validator voor aangepaste certificaten.
Het <verificatie-element> bevat een RevocationMode
kenmerk dat aangeeft hoe certificaten worden gecontroleerd op intrekking. De standaardwaarde is 'online', wat aangeeft dat certificaten automatisch worden gecontroleerd op intrekking. Zie Werken met certificaten voor meer informatie.
ServiceAuthorization
Het <element serviceAuthorization> bevat elementen die van invloed zijn op autorisatie, aangepaste rolproviders en imitatie.
De PrincipalPermissionAttribute klasse wordt toegepast op een servicemethode. Het kenmerk specificeert de groepen gebruikers die moeten worden gebruikt bij het autoriseren van het gebruik van een beveiligde methode. De standaardwaarde is UseWindowsGroups en geeft aan dat Windows-groepen, zoals 'Administrators' of 'Users', worden gezocht naar een identiteit die toegang probeert te krijgen tot een resource. U kunt ook UseAspNetRoles opgeven om een aangepaste rolprovider te gebruiken die is geconfigureerd onder het <system.web
> element, zoals wordt weergegeven in de volgende code.
<system.web>
<membership defaultProvider="SqlProvider"
userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlConn"
applicationName="MembershipProvider"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed" />
</providers>
</membership>
<!-- Other configuration code not shown.-->
</system.web>
De volgende code toont de roleProviderName
gebruikte code met het principalPermissionMode
kenmerk.
<behaviors>
<behavior name="ServiceBehaviour">
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName ="SqlProvider" />
</behavior>
<!-- Other configuration code not shown. -->
</behaviors>
Beveiligingscontroles configureren
Gebruik de <serviceSecurityAudit> om het logboek op te geven waarin wordt geschreven en naar welke typen gebeurtenissen moet worden geregistreerd. Zie Controle voor meer informatie.
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior">
<serviceSecurityAudit auditLogLocation="Application"
suppressAuditFailure="true"
serviceAuthorizationAuditLevel="Success"
messageAuthenticationAuditLevel="Success" />
</behavior>
</serviceBehaviors>
</behaviors>
Exchange voor beveiligde metagegevens
Het exporteren van metagegevens naar clients is handig voor service- en clientontwikkelaars, omdat het downloads van configuratie- en clientcode mogelijk maakt. Om de blootstelling van een service aan kwaadwillende gebruikers te verminderen, is het mogelijk om de overdracht te beveiligen met behulp van het SSL-mechanisme via HTTP (HTTPS). Hiervoor moet u eerst een geschikt X.509-certificaat binden aan een specifieke poort op de computer waarop de service wordt gehost. (Zie voor meer informatie Werken met certificaten.) Voeg ten tweede een <serviceMetadata> toe aan de serviceconfiguratie en stel het HttpsGetEnabled
kenmerk in op true
. Stel ten slotte het HttpsGetUrl
kenmerk in op de URL van het eindpunt voor servicemetagegevens, zoals wordt weergegeven in het volgende voorbeeld.
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior">
<serviceMetadata httpsGetEnabled="true"
httpsGetUrl="https://myComputerName/myEndpoint" />
</behavior>
</serviceBehaviors>
</behaviors>