Sdílet prostřednictvím


Postupy: Zabezpečené koncové body metadat

Metadata služby můžou obsahovat citlivé informace o vaší aplikaci, které může uživatel se zlými úmysly využít. Spotřebitelé vaší služby mohou také vyžadovat zabezpečený mechanismus pro získání metadat o vaší službě. Proto je někdy nutné publikovat metadata pomocí zabezpečeného koncového bodu.

Koncové body metadat jsou obecně zabezpečené pomocí standardních mechanismů zabezpečení definovaných ve Službě Windows Communication Foundation (WCF) pro zabezpečení koncových bodů aplikace. Další informace najdete v tématu Přehled zabezpečení.

Toto téma vás provede postupem vytvoření koncového bodu zabezpečeného certifikátem SSL (Secure Sockets Layer) nebo jinými slovy koncového bodu HTTPS.

Vytvoření zabezpečeného koncového bodu metadat HTTPS GET v kódu

  1. Nakonfigurujte port s odpovídajícím certifikátem X.509. Certifikát musí pocházet z důvěryhodné autority a musí mít zamýšlené použití "Autorizace služby". K připojení certifikátu k portu musíte použít nástroj HttpCfg.exe. Viz Postupy: Konfigurace portu s certifikátem SSL.

    Důležité

    Předmět certifikátu nebo jeho dns (Domain Name System) musí odpovídat názvu počítače. To je nezbytné, protože jedním z prvních kroků, které mechanismus HTTPS provádí, je zkontrolovat, jestli je certifikát vystavený stejnému identifikátoru URI (Uniform Resource Identifier) jako adresa, na které je vyvolána.

  2. Vytvořte novou instanci ServiceMetadataBehavior třídy.

  3. HttpsGetEnabled Nastavte vlastnost ServiceMetadataBehavior třídy na true.

  4. HttpsGetUrl Nastavte vlastnost na odpovídající adresu URL. Všimněte si, že pokud zadáte absolutní adresu, adresa URL musí začínat schématem https://. Pokud zadáte relativní adresu, musíte zadat základní adresu HTTPS pro hostitele služby. Pokud tato vlastnost není nastavená, výchozí adresa je "" nebo přímo na základní adrese HTTPS pro službu.

  5. Přidejte instanci do kolekce chování, kterou Behaviors vrátí vlastnost ServiceDescription třídy, jak je znázorněno v následujícím kódu.

    // 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
    

Vytvoření zabezpečeného koncového bodu metadat HTTPS GET v konfiguraci

  1. <Přidejte element behaviors> do <elementu system.serviceModel> konfiguračního souboru pro vaši službu.

  2. Přidejte do elementu< behaviors> element serviceBehaviors>.<

  3. Přidejte do elementu <<serviceBehaviors> prvek chování.>

  4. name Nastavte atribut <behavior> prvku na odpovídající hodnotu. name Atribut je vyžadován. Následující příklad používá hodnotu mySvcBehavior.

  5. Přidejte do elementu <<behavior> serviceMetadata.>

  6. httpsGetEnabled Nastavte atribut <serviceMetadata> prvku na true.

  7. httpsGetUrl Nastavte atribut <serviceMetadata> prvku na odpovídající hodnotu. Všimněte si, že pokud zadáte absolutní adresu, adresa URL musí začínat schématem https://. Pokud zadáte relativní adresu, musíte zadat základní adresu HTTPS pro hostitele služby. Pokud tato vlastnost není nastavená, výchozí adresa je "" nebo přímo na základní adrese HTTPS pro službu.

  8. Chcete-li použít chování se službou, nastavte behaviorConfiguration atribut< prvku služby> na hodnotu atributu name elementu chování. Následující konfigurační kód ukazuje úplný příklad.

    <?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>
    

Příklad

Následující příklad vytvoří instanci ServiceHost třídy a přidá koncový bod. Kód pak vytvoří instanci ServiceMetadataBehavior třídy a nastaví vlastnosti pro vytvoření zabezpečeného bodu výměny metadat.

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 @ {0}:8037/serviceModelSamples/", machineName);
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()

Probíhá kompilace kódu

Příklad kódu používá následující obory názvů:

Viz také