Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Ein Client greift auf einen oder mehrere Webdienste zu, die über ein Netzwerk verteilt werden. Die Webdienste sind so konzipiert, dass der Zugriff auf zusätzliche Ressourcen (z. B. Datenbanken oder andere Webdienste) in der Geschäftslogik des Webdiensts gekapselt wird. Diese Ressourcen müssen vor unbefugtem Zugriff geschützt werden. Die folgende Abbildung zeigt einen vertrauenswürdigen Subsystemprozess.
Die folgenden Schritte beschreiben den vertrauenswürdigen Subsystemprozess wie dargestellt:
Der Client sendet eine Anforderung an das vertrauenswürdige Subsystem zusammen mit den Anmeldeinformationen.
Das vertrauenswürdige Subsystem authentifiziert und autorisiert den Benutzer.
Das vertrauenswürdige Subsystem sendet eine Anforderungsnachricht an die Remoteressource. Diese Anforderung wird von den Anmeldeinformationen für das vertrauenswürdige Subsystem (oder das Dienstkonto, unter dem der vertrauenswürdige Subsystemprozess ausgeführt wird) begleitet.
Die Back-End-Ressource authentifiziert und autorisiert das vertrauenswürdige Subsystem. Anschließend verarbeitet sie die Anforderung und gibt eine Antwort auf das vertrauenswürdige Subsystem aus.
Das vertrauenswürdige Subsystem verarbeitet die Antwort und stellt dem Client eine eigene Antwort aus.
| Charakteristisch | BESCHREIBUNG |
|---|---|
| Sicherheitsmodus | Nachricht |
| Interoperabilität | Nur Windows Communication Foundation (WCF). |
| Authentifizierung (Dienst) | Der Sicherheitstokendienst authentifiziert und autorisiert Clients. |
| Authentifizierung (Client) | Das vertrauenswürdige Subsystem authentifiziert den Client, und die Ressource authentifiziert den vertrauenswürdigen Subsystemdienst. |
| Integrität | Ja |
| Vertraulichkeit | Ja |
| Transport | HTTP zwischen Client und dem vertrauenswürdigen Subsystemdienst. NET.TCP zwischen dem vertrauenswürdigen Subsystemdienst und der Ressource (Back-End-Dienst). |
| Verbindlich | WSHttpBinding und NetTcpBinding<wsFederationHttpBinding> |
Ressource (Back-End-Dienst)
Programmcode
Der folgende Code zeigt, wie Sie einen Dienstendpunkt für die Ressource erstellen, der transportsicherheit über das TCP-Transportprotokoll verwendet.
// Create a ServiceHost for the CalculatorService type and provide the base address.
using (ServiceHost host = new ServiceHost(typeof(BackendService)))
{
BindingElementCollection bindingElements = new BindingElementCollection();
bindingElements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement());
bindingElements.Add(new WindowsStreamSecurityBindingElement());
bindingElements.Add(new TcpTransportBindingElement());
CustomBinding backendServiceBinding = new CustomBinding(bindingElements);
host.AddServiceEndpoint(typeof(ICalculator), backendServiceBinding, "BackendService");
// Open the ServiceHostBase to create listeners and start listening for messages.
host.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
host.Close();
}
' Create a ServiceHost for the CalculatorService type and provide the base address.
Using host As New ServiceHost(GetType(BackendService), New Uri("net.tcp://localhost:8001/BackendService"))
Dim bindingElements As New BindingElementCollection()
bindingElements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement())
bindingElements.Add(New WindowsStreamSecurityBindingElement())
bindingElements.Add(New TcpTransportBindingElement())
Dim backendServiceBinding As New CustomBinding(bindingElements)
host.AddServiceEndpoint(GetType(ICalculator), backendServiceBinding, "BackendService")
' Open the ServiceHostBase to create listeners and start listening for messages.
host.Open()
' The service can now be accessed.
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
host.Close()
End Using
Konfiguration
Mit der folgenden Konfiguration wird derselbe Endpunkt mithilfe von Konfiguration eingerichtet.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.BackendService"
behaviorConfiguration="BackendServiceBehavior">
<endpoint address="net.tcp://localhost.com:8001/BackendService"
binding="customBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator"/>
</service>
</services>
<bindings>
<customBinding>
<binding name="Binding1">
<security authenticationMode="UserNameOverTransport"/>
<windowsStreamSecurity/>
<tcpTransport/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="BackendServiceBehavior">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator, BackendService"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Vertrauenswürdiges Subsystem
Programmcode
Der folgende Code zeigt, wie Sie einen Dienstendpunkt für das vertrauenswürdige Subsystem erstellen, das die Nachrichtensicherheit über das HTTP-Protokoll und einen Benutzernamen und ein Kennwort für die Authentifizierung verwendet.
Uri baseAddress = new Uri("http://localhost:8000/FacadeService");
using (ServiceHost myServiceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType =
MessageCredentialType.UserName;
myServiceHost.AddServiceEndpoint(typeof(CalculatorService), binding, string.Empty);
myServiceHost.Open();
// Wait for calls.
myServiceHost.Close();
}
Dim baseAddress As New Uri("http://localhost:8000/FacadeService")
Using myServiceHost As New ServiceHost(GetType(CalculatorService), baseAddress)
Dim binding As New WSHttpBinding()
binding.Security.Mode = SecurityMode.Message
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName
myServiceHost.AddServiceEndpoint(GetType(CalculatorService), binding, String.Empty)
myServiceHost.Open()
' Wait for calls.
myServiceHost.Close()
End Using
Der folgende Code zeigt einen Dienst in einem vertrauenswürdigen Subsystem, der mit einem Back-End-Dienst kommuniziert, indem die Transportsicherheit über das TCP-Transportprotokoll verwendet wird.
public double Multiply(double n1, double n2)
{
// Create the binding.
BindingElementCollection bindingElements = new BindingElementCollection();
bindingElements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement());
bindingElements.Add(new WindowsStreamSecurityBindingElement());
bindingElements.Add(new TcpTransportBindingElement());
CustomBinding backendServiceBinding = new CustomBinding(bindingElements);
// Create the endpoint address.
EndpointAddress ea = new
EndpointAddress("http://contoso.com:8001/BackendService");
// Call the back-end service.
CalculatorClient client = new CalculatorClient(backendServiceBinding, ea);
client.ClientCredentials.UserName.UserName = ServiceSecurityContext.Current.PrimaryIdentity.Name;
double result = client.Multiply(n1, n2);
client.Close();
return result;
}
Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double _
Implements ICalculator.Multiply
' Create the binding.
Dim bindingElements As New BindingElementCollection()
bindingElements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement())
bindingElements.Add(New WindowsStreamSecurityBindingElement())
bindingElements.Add(New TcpTransportBindingElement())
Dim backendServiceBinding As New CustomBinding(bindingElements)
' Create the endpoint address.
Dim ea As New EndpointAddress("http://contoso.com:8001/BackendService")
' Call the back-end service.
Dim client As New CalculatorClient(backendServiceBinding, ea)
client.ClientCredentials.UserName.UserName = ServiceSecurityContext.Current.PrimaryIdentity.Name
Dim result As Double = client.Multiply(n1, n2)
client.Close()
Return result
End Function
Konfiguration
Mit der folgenden Konfiguration wird derselbe Endpunkt mithilfe von Konfiguration eingerichtet. Beachten Sie die beiden Bindungen: Einer sichert den im vertrauenswürdigen Subsystem gehosteten Dienst und der andere kommuniziert zwischen dem vertrauenswürdigen Subsystem und dem Back-End-Dienst.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.FacadeService"
behaviorConfiguration="FacadeServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/FacadeService"/>
</baseAddresses>
</host>
<endpoint address="http://localhost:8000/FacadeService"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator"/>
</service>
</services>
<client>
<endpoint name=""
address="net.tcp://contoso.com:8001/BackendService"
binding="customBinding"
bindingConfiguration="ClientBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator"/>
</client>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
<customBinding>
<binding name="ClientBinding">
<security authenticationMode="UserNameOverTransport"/>
<windowsStreamSecurity/>
<tcpTransport/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="FacadeServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceCredentials>
<serviceCertificate findValue="Contoso.com"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator, FacadeService"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Kunde
Programmcode
Der folgende Code zeigt, wie Sie den Client erstellen, der mit dem vertrauenswürdigen Subsystem kommuniziert, indem die Nachrichtensicherheit über das HTTP-Protokoll und einen Benutzernamen und ein Kennwort für die Authentifizierung verwendet wird.
// Create the binding.
WSHttpBinding subsystemBinding = new WSHttpBinding();
subsystemBinding.Security.Mode = SecurityMode.Message;
subsystemBinding.Security.Message.ClientCredentialType =
MessageCredentialType.UserName;
// Create the endpoint address.
EndpointAddress ea = new
EndpointAddress("http://www.cohowinery.com:8000/FacadeService");
CalculatorClient client = new CalculatorClient(subsystemBinding, ea);
// Configure client with valid machine or domain account (username,password)
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();
// Call the Multiply service operation.
double value1 = 39D;
double value2 = 50.44D;
double result = client.Multiply(value1, value2);
Console.WriteLine($"Multiply({value1},{value2}) = {result}");
//Closing the client gracefully closes the connection and cleans up resources
client.Close();
' Create the binding.
Dim subsystemBinding As New WSHttpBinding()
subsystemBinding.Security.Mode = SecurityMode.Message
subsystemBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName
' Create the URI for the endpoint.
Dim ea As New EndpointAddress("http://www.cohowinery.com:8000/FacadeService")
Dim client As New CalculatorClient(subsystemBinding, ea)
' Configure client with valid machine or domain account (username,password)
client.ClientCredentials.UserName.UserName = username
client.ClientCredentials.UserName.Password = password.ToString()
' Call the Multiply service operation.
Dim value1 As Double = 39
Dim value2 As Double = 50.44
Dim result As Double = client.Multiply(value1, value2)
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result)
'Closing the client gracefully closes the connection and cleans up resources
client.Close()
Konfiguration
Der folgende Code konfiguriert den Client für die Verwendung der Nachrichtensicherheit über das HTTP-Protokoll und einen Benutzernamen und ein Kennwort für die Authentifizierung. Der Benutzername und das Kennwort können nur mithilfe von Code angegeben werden (er kann nicht konfiguriert werden).
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint name=""
address="http://www.cohowinery.com:8000/FacadeService"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientUserNameBehavior"
contract="Microsoft.ServiceModel.Samples.ICalculator"/>
</client>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="ClientUserNameBehavior">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>