Zaufany podsystem
Klient uzyskuje dostęp do co najmniej jednej usługi sieci Web dystrybuowanej w sieci. Usługi sieci Web zostały zaprojektowane tak, aby dostęp do dodatkowych zasobów (takich jak bazy danych lub inne usługi sieci Web) był hermetyzowany w logice biznesowej usługi sieci Web. Te zasoby muszą być chronione przed nieautoryzowanym dostępem. Poniższa ilustracja przedstawia proces zaufanego podsystemu.
W poniższych krokach opisano proces zaufanego podsystemu, jak pokazano:
Klient przesyła żądanie do zaufanego podsystemu wraz z poświadczeniami.
Zaufany podsystem uwierzytelnia i autoryzuje użytkownika.
Zaufany podsystem wysyła komunikat żądania do zasobu zdalnego. To żądanie jest dołączone do poświadczeń dla zaufanego podsystemu (lub konta usługi, w ramach którego jest wykonywany zaufany proces podsystemu).
Zasób zaplecza uwierzytelnia się i autoryzuje zaufany podsystem. Następnie przetwarza żądanie i wysyła odpowiedź na zaufany podsystem.
Zaufany podsystem przetwarza odpowiedź i wystawia własną odpowiedź na klienta.
Characteristic | opis |
---|---|
Tryb zabezpieczeń | Komunikat |
Współdziałanie | Tylko program Windows Communication Foundation (WCF). |
Uwierzytelnianie (usługa) | Usługa tokenu zabezpieczającego uwierzytelnia i autoryzuje klientów. |
Uwierzytelnianie (klient) | Zaufany podsystem uwierzytelnia klienta, a zasób uwierzytelnia zaufaną usługę podsystemu. |
Integralność | Tak |
Poufność | Tak |
Transport | Protokół HTTP między klientem a zaufaną usługą podsystemu. NETTO. Protokół TCP między usługą zaufanego podsystemu a zasobem (usługa zaplecza). |
Wiązanie | WSHttpBinding i NetTcpBinding<wsFederationHttpBinding> |
Zasób (usługa zaplecza)
Kod
Poniższy kod pokazuje, jak utworzyć punkt końcowy usługi dla zasobu, który używa zabezpieczeń transportu za pośrednictwem protokołu transportowego TCP.
// 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
Konfigurowanie
Poniższa konfiguracja konfiguruje ten sam punkt końcowy przy użyciu konfiguracji.
<?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>
Zaufany podsystem
Kod
Poniższy kod pokazuje, jak utworzyć punkt końcowy usługi dla zaufanego podsystemu, który używa zabezpieczeń komunikatów za pośrednictwem protokołu HTTP oraz nazwy użytkownika i hasła do uwierzytelniania.
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
Poniższy kod przedstawia usługę w zaufanym podsystemie, który komunikuje się z usługą zaplecza przy użyciu zabezpieczeń transportu za pośrednictwem protokołu transportowego TCP.
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
Konfigurowanie
Poniższa konfiguracja konfiguruje ten sam punkt końcowy przy użyciu konfiguracji. Zwróć uwagę na dwa powiązania: Jedna zabezpiecza usługę hostowaną w zaufanym podsystemie, a drugą komunikuje się między zaufanym podsystemem a usługą zaplecza.
<?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>
Klient
Kod
Poniższy kod pokazuje, jak utworzyć klienta, który komunikuje się z zaufanym podsystemem przy użyciu zabezpieczeń komunikatów za pośrednictwem protokołu HTTP oraz nazwy użytkownika i hasła do uwierzytelniania.
// 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({0},{1}) = {2}", 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()
Konfigurowanie
Poniższy kod konfiguruje klienta do używania zabezpieczeń komunikatów za pośrednictwem protokołu HTTP oraz nazwy użytkownika i hasła do uwierzytelniania. Nazwę użytkownika i hasło można określić tylko przy użyciu kodu (nie można go skonfigurować).
<?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>