Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Metagegevens voor een service kunnen gevoelige informatie bevatten over uw toepassing die een kwaadwillende gebruiker kan gebruiken. Consumenten van uw service vereisen mogelijk ook een veilig mechanisme voor het verkrijgen van metagegevens over uw service. Daarom is het soms nodig om uw metagegevens te publiceren met behulp van een beveiligd eindpunt.
Metagegevenseindpunten worden over het algemeen beveiligd met behulp van de standaardbeveiligingsmechanismen die zijn gedefinieerd in WCF (Windows Communication Foundation) voor het beveiligen van toepassingseindpunten. Zie Security Overviewvoor meer informatie.
In dit onderwerp worden de stappen beschreven voor het maken van een eindpunt dat is beveiligd met een SSL-certificaat (Secure Sockets Layer) of met andere woorden een HTTPS-eindpunt.
Een beveiligd HTTPS GET-metagegevenseindpunt maken in code
Configureer een poort met een geschikt X.509-certificaat. Het certificaat moet afkomstig zijn van een vertrouwde instantie en moet beschikken over het beoogde gebruik van 'Serviceautorisatie'. U moet het hulpprogramma HttpCfg.exe gebruiken om het certificaat aan de poort te koppelen. Zie Procedure: Een poort configureren met een SSL-certificaat.
Belangrijk
Het onderwerp van het certificaat of het DNS (Domain Name System) moet overeenkomen met de naam van de computer. Dit is essentieel omdat een van de eerste stappen die het HTTPS-mechanisme uitvoert, is controleren of het certificaat wordt uitgegeven aan dezelfde URI (Uniform Resource Identifier) als het adres waarop het wordt aangeroepen.
Maak een nieuw exemplaar van de ServiceMetadataBehavior-klasse.
Stel de eigenschap HttpsGetEnabled van de klasse ServiceMetadataBehavior in op
true.Stel de eigenschap HttpsGetUrl in op een juiste URL. Houd er rekening mee dat als u een absoluut adres opgeeft, de URL moet beginnen met het schema
https://. Als u een relatief adres opgeeft, moet u een HTTPS-basisadres opgeven voor uw servicehost. Als deze eigenschap niet is ingesteld, is het standaardadres een lege string (""), of is het direct het basisadres van de service op HTTPS.Voeg de instantie toe aan de collectie gedragingen die door de Behaviors eigenschap van de ServiceDescription klasse wordt geretourneerd, zoals wordt weergegeven in de volgende code.
// Create a new metadata behavior object and set its properties to // create a secure endpoint. ServiceMetadataBehavior sb = new ServiceMetadataBehavior(); sb.HttpsGetEnabled = true; sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint"); myServiceHost.Description.Behaviors.Add(sb); myServiceHost.Open();' Create a new metadata behavior object and set its properties to ' create a secure endpoint. Dim sb As New ServiceMetadataBehavior() With sb .HttpsGetEnabled = True .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint") End With With myServiceHost .Description.Behaviors.Add(sb) .Open() End With
Een beveiligd HTTPS GET-metagegevenseindpunt maken in de configuratie
Voeg een <gedragingen> element toe aan het <system.serviceModel> element van het configuratiebestand voor uw service.
Voeg een <serviceBehaviors> element toe aan het <gedragingen> element.
Voeg een <>-element toe aan het
<serviceBehaviors>-element.Stel het kenmerk
namevan het<behavior>-element in op een juiste waarde. Het kenmerknameis vereist. In het onderstaande voorbeeld wordt de waardemySvcBehaviorgebruikt.Voeg een <serviceMetadata-> toe aan het element
<behavior>.Stel het kenmerk
httpsGetEnabledvan het<serviceMetadata>-element in optrue.Stel het kenmerk
httpsGetUrlvan het<serviceMetadata>-element in op een juiste waarde. Houd er rekening mee dat als u een absoluut adres opgeeft, de URL moet beginnen met het schemahttps://. Als u een relatief adres opgeeft, moet u een HTTPS-basisadres opgeven voor uw servicehost. Als deze eigenschap niet is ingesteld, is het standaardadres een lege string (""), of is het direct het basisadres van de service op HTTPS.Als u het gedrag met een service wilt gebruiken, stelt u het
behaviorConfigurationkenmerk van het <service-element> in op de waarde van het naamkenmerk van het gedragselement. De volgende configuratiecode toont een volledig voorbeeld.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="mySvcBehavior"> <serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://localhost:8036/calcMetadata" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="mySvcBehavior" name="Microsoft.Security.Samples.Calculator"> <endpoint address="http://localhost:8037/ServiceModelSamples/calculator" binding="wsHttpBinding" bindingConfiguration="" contract="Microsoft.Security.Samples.ICalculator" /> </service> </services> </system.serviceModel> </configuration>
Voorbeeld
In het volgende voorbeeld wordt een exemplaar van een ServiceHost-klasse gemaakt en wordt een eindpunt toegevoegd. De code maakt vervolgens een exemplaar van de ServiceMetadataBehavior-klasse en stelt de eigenschappen in om een beveiligd uitwisselingspunt voor metagegevens te maken.
WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType =
MessageCredentialType.Windows;
// Create the Type instances for later use and the URI for
// the base address.
Type contractType = typeof(ICalculator);
Type serviceType = typeof(Calculator);
Uri baseAddress = new
Uri("http://localhost:8037/serviceModelSamples/");
// Create the ServiceHost and add an endpoint.
ServiceHost myServiceHost =
new ServiceHost(serviceType, baseAddress);
myServiceHost.AddServiceEndpoint
(contractType, myBinding, "secureCalculator");
// Create a new metadata behavior object and set its properties to
// create a secure endpoint.
ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
sb.HttpsGetEnabled = true;
sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
myServiceHost.Description.Behaviors.Add(sb);
myServiceHost.Open();
// Use the GetHostEntry method to return the actual machine name.
string machineName = System.Net.Dns.GetHostEntry("").HostName ;
Console.WriteLine($"Listening @ {machineName}:8037/serviceModelSamples/");
Console.WriteLine("Press Enter to close the service");
Console.ReadLine();
myServiceHost.Close();
Dim myBinding As New WSHttpBinding()
With myBinding.Security
.Mode = SecurityMode.Message
.Message.ClientCredentialType = MessageCredentialType.Windows
End With
' Create the Type instances for later use and the URI for
' the base address.
Dim contractType = GetType(ICalculator)
Dim serviceType = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8037/serviceModelSamples/")
' Create the ServiceHost and add an endpoint.
Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")
' Create a new metadata behavior object and set its properties to
' create a secure endpoint.
Dim sb As New ServiceMetadataBehavior()
With sb
.HttpsGetEnabled = True
.HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
End With
With myServiceHost
.Description.Behaviors.Add(sb)
.Open()
End With
' Use the GetHostEntry method to return the actual machine name.
Dim machineName = System.Net.Dns.GetHostEntry("").HostName
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName)
Console.WriteLine("Press Enter to close the service")
Console.ReadLine()
myServiceHost.Close()
De code compileren
In het codevoorbeeld worden de volgende naamruimten gebruikt: