Procedure: De eigenschap ProtectionLevel instellen
U kunt het beveiligingsniveau instellen door een geschikt kenmerk toe te passen en de eigenschap in te stellen. U kunt beveiliging op serviceniveau instellen om alle onderdelen van elk bericht te beïnvloeden, of u kunt beveiliging instellen op steeds gedetailleerdere niveaus, van methoden tot berichtonderdelen. Zie Understanding Protection Level voor meer informatie over de ProtectionLevel
eigenschap.
Notitie
U kunt alleen beveiligingsniveaus instellen in code, niet in de configuratie.
Alle berichten voor een service ondertekenen
Maak een interface voor de service.
Pas het ServiceContractAttribute kenmerk toe op de service en stel de ProtectionLevel eigenschap Signin op , zoals wordt weergegeven in de volgende code (het standaardniveau is EncryptAndSign).
// Set the ProtectionLevel on the whole service to Sign. [ServiceContract(ProtectionLevel = ProtectionLevel.Sign)] public interface ICalculator
' Set the ProtectionLevel on the whole service to Sign. <ServiceContract(ProtectionLevel:=ProtectionLevel.Sign)> _ Public Interface ICalculator
Alle berichtonderdelen voor een bewerking ondertekenen
Maak een interface voor de service en pas het ServiceContractAttribute kenmerk toe op de interface.
Voeg een methodedeclaratie toe aan de interface.
Pas het OperationContractAttribute kenmerk toe op de methode en stel de ProtectionLevel eigenschap Signin op , zoals wordt weergegeven in de volgende code.
// Set the ProtectionLevel on the whole service to Sign. [ServiceContract(ProtectionLevel = ProtectionLevel.Sign)] public interface ICalculator { // Set the ProtectionLevel on this operation to None. [OperationContract(ProtectionLevel = ProtectionLevel.Sign)] double Add(double a, double b); }
' Set the ProtectionLevel on the whole service to Sign. <ServiceContract(ProtectionLevel:=ProtectionLevel.Sign)> _ Public Interface ICalculator ' Set the ProtectionLevel on this operation to Sign. <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _ Function Add(ByVal a As Double, ByVal b As Double) As Double End Interface
Foutberichten beveiligen
Uitzonderingen die in een service worden gegenereerd, kunnen als SOAP-fouten naar een client worden verzonden. Zie Voor meer informatie over het maken van sterk getypte fouten opgeven en afhandelen van fouten in contracten en services en procedures: Fouten declareren in servicecontracten.
Een foutbericht beveiligen
Maak een type dat het foutbericht vertegenwoordigt. In het volgende voorbeeld wordt een klasse met de naam
MathFault
twee velden gemaakt.Pas het DataContractAttribute kenmerk toe op het type en een DataMemberAttribute kenmerk op elk veld dat moet worden geserialiseerd, zoals wordt weergegeven in de volgende code.
[DataContract] public class MathFault { [DataMember] public string operation; [DataMember] public string description; }
<DataContract()> _ Public Class MathFault <DataMember()> _ Public operation As String <DataMember()> _ Public description As String End Class
Pas in de interface die de fout retourneert het FaultContractAttribute kenmerk toe op de methode die de fout retourneert en stel de
detailType
parameter in op het type foutklasse.Stel in de constructor ook de ProtectionLevel eigenschap EncryptAndSignin op , zoals wordt weergegeven in de volgende code.
public interface ICalculator { // Set the ProtectionLevel on a FaultContractAttribute. [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] [FaultContract( typeof(MathFault), Action = @"http://localhost/Add", Name = "AddFault", Namespace = "http://contoso.com", ProtectionLevel = ProtectionLevel.EncryptAndSign)] double Add(double a, double b); }
Public Interface ICalculator ' Set the ProtectionLevel on a FaultContractAttribute. <OperationContract(ProtectionLevel:=ProtectionLevel.EncryptAndSign), _ FaultContract(GetType(MathFault), ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _ Function Add(ByVal a As Double, ByVal b As Double) As Double End Interface
Berichtonderdelen beveiligen
Gebruik een berichtcontract om delen van een bericht te beveiligen. Zie Berichtencontracten gebruiken voor meer informatie over berichtcontracten.
De hoofdtekst van een bericht beveiligen
Maak een type dat het bericht vertegenwoordigt. In het volgende voorbeeld wordt een
Company
klasse met twee velden gemaakt enCompanyName
CompanyID
.Pas het MessageContractAttribute kenmerk toe op de klasse en stel de ProtectionLevel eigenschap in op EncryptAndSign.
Pas het MessageHeaderAttribute kenmerk toe op een veld dat wordt uitgedrukt als een berichtkop en stel de
ProtectionLevel
eigenschap in op EncryptAndSign.Pas het MessageBodyMemberAttribute veld toe dat wordt uitgedrukt als onderdeel van de berichttekst en stel de
ProtectionLevel
eigenschap EncryptAndSignin op , zoals wordt weergegeven in het volgende voorbeeld.[MessageContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] public class Company { [MessageHeader(ProtectionLevel = ProtectionLevel.Sign)] public string CompanyName; [MessageBodyMember(ProtectionLevel = ProtectionLevel.EncryptAndSign)] public string CompanyID; }
<MessageContract(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _ Public Class Company <MessageHeader(ProtectionLevel:=ProtectionLevel.Sign)> _ Public CompanyName As String <MessageBodyMember(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _ Public CompanyID As String End Class
Opmerking
In het volgende voorbeeld wordt de ProtectionLevel
eigenschap van verschillende kenmerkklassen ingesteld op verschillende locaties in een service.
[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface ICalculator
{
[OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
double Add(double a, double b);
[OperationContract()]
[FaultContract(typeof(MathFault),
ProtectionLevel = ProtectionLevel.EncryptAndSign)]
double Subtract(double a, double b);
[OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
Company GetCompanyInfo();
}
[DataContract]
public class MathFault
{
[DataMember]
public string operation;
[DataMember]
public string description;
}
[MessageContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public class Company
{
[MessageHeader(ProtectionLevel = ProtectionLevel.Sign)]
public string CompanyName;
[MessageBodyMember(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public string CompanyID;
}
[MessageContract(ProtectionLevel = ProtectionLevel.Sign)]
public class Calculator : ICalculator
{
public double Add(double a, double b)
{
return a + b;
}
public double Subtract(double a, double b)
{
return a - b;
}
public Company GetCompanyInfo()
{
Company co = new Company();
co.CompanyName = "www.cohowinery.com";
return co;
}
}
public class Test
{
static void Main()
{
Test t = new Test();
try
{
t.Run();
}
catch (System.InvalidOperationException inv)
{
Console.WriteLine(inv.Message);
}
}
private void Run()
{
// Create a binding and set the security mode to Message.
WSHttpBinding b = new WSHttpBinding();
b.Security.Mode = SecurityMode.Message;
Type contractType = typeof(ICalculator);
Type implementedContract = typeof(Calculator);
Uri baseAddress = new Uri("http://localhost:8044/base");
// Create the ServiceHost and add an endpoint.
ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
sh.AddServiceEndpoint(contractType, b, "Calculator");
ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
sm.HttpGetEnabled = true;
sh.Description.Behaviors.Add(sm);
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.My,
X509FindType.FindByIssuerName,
"ValidCertificateIssuer");
foreach (ServiceEndpoint se in sh.Description.Endpoints)
{
ContractDescription cd = se.Contract;
Console.WriteLine("\nContractDescription: ProtectionLevel = {0}", cd.Name, cd.ProtectionLevel);
foreach (OperationDescription od in cd.Operations)
{
Console.WriteLine("\nOperationDescription: Name = {0}", od.Name, od.ProtectionLevel);
Console.WriteLine("ProtectionLevel = {1}", od.Name, od.ProtectionLevel);
foreach (MessageDescription m in od.Messages)
{
Console.WriteLine("\t {0}: {1}", m.Action, m.ProtectionLevel);
foreach (MessageHeaderDescription mh in m.Headers)
{
Console.WriteLine("\t\t {0}: {1}", mh.Name, mh.ProtectionLevel);
foreach (MessagePropertyDescription mp in m.Properties)
{
Console.WriteLine("{0}: {1}", mp.Name, mp.ProtectionLevel);
}
}
}
}
}
sh.Open();
Console.WriteLine("Listening");
Console.ReadLine();
sh.Close();
}
}
<ServiceContract(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Public Interface ICalculator
<OperationContract(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Function Add(ByVal a As Double, ByVal b As Double) As Double
<OperationContract(), _
FaultContract _
(GetType(MathFault), _
Action:="http://localhost/Add", _
Name:="AddFault", _
Namespace:="http://contoso.com", _
ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Function Subtract(ByVal a As Double, ByVal b As Double) As Double
<OperationContract(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Function GetCompanyInfo() As Company
End Interface
<DataContract()> _
Public Class MathFault
<DataMember()> _
Public operation As String
<DataMember()> _
Public description As String
End Class
<MessageContract(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Public Class Company
<MessageHeader(ProtectionLevel:=ProtectionLevel.Sign)> _
Public CompanyName As String
<MessageBodyMember(ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Public CompanyID As String
End Class
<MessageContract(ProtectionLevel:=ProtectionLevel.Sign)> _
Public Class Calculator
Implements ICalculator
Public Function Add(ByVal a As Double, ByVal b As Double) As Double _
Implements ICalculator.Add
Return a + b
End Function
Public Function Subtract(ByVal a As Double, ByVal b As Double) As Double _
Implements ICalculator.Subtract
Return a - b
End Function
Public Function GetCompanyInfo() As Company Implements ICalculator.GetCompanyInfo
Dim co As New Company()
co.CompanyName = "www.cohowinery.com"
Return co
End Function
End Class
Public Class Test
Shared Sub Main()
Dim t As New Test()
Try
t.Run()
Catch inv As System.InvalidOperationException
Console.WriteLine(inv.Message)
End Try
End Sub
Private Sub Run()
' Create a binding and set the security mode to Message.
Dim b As New WSHttpBinding()
b.Security.Mode = SecurityMode.Message
Dim contractType As Type = GetType(ICalculator)
Dim implementedContract As Type = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8044/base")
' Create the ServiceHost and add an endpoint.
Dim sh As New ServiceHost(implementedContract, baseAddress)
sh.AddServiceEndpoint(contractType, b, "Calculator")
Dim sm As New ServiceMetadataBehavior()
sm.HttpGetEnabled = True
sh.Description.Behaviors.Add(sm)
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.CurrentUser, StoreName.My, _
X509FindType.FindByIssuerName, "ValidCertificateIssuer")
Dim se As ServiceEndpoint
For Each se In sh.Description.Endpoints
Dim cd As ContractDescription = se.Contract
Console.WriteLine(vbLf + "ContractDescription: ProtectionLevel = {0}", _
cd.Name, cd.ProtectionLevel)
Dim od As OperationDescription
For Each od In cd.Operations
Console.WriteLine(vbLf + "OperationDescription: Name = {0}", od.Name, od.ProtectionLevel)
Console.WriteLine("ProtectionLevel = {1}", od.Name, od.ProtectionLevel)
Dim m As MessageDescription
For Each m In od.Messages
Console.WriteLine(vbTab + " {0}: {1}", m.Action, m.ProtectionLevel)
Dim mh As MessageHeaderDescription
For Each mh In m.Headers
Console.WriteLine(vbTab + vbTab + " {0}: {1}", mh.Name, mh.ProtectionLevel)
Dim mp As MessagePropertyDescription
For Each mp In m.Properties
Console.WriteLine("{0}: {1}", mp.Name, mp.ProtectionLevel)
Next mp
Next mh
Next m
Next od
Next se
sh.Open()
Console.WriteLine("Listening")
Console.ReadLine()
sh.Close()
End Sub
End Class
De code compileren
De volgende code toont de naamruimten die nodig zijn om de voorbeeldcode te compileren.
using System;
using System.ServiceModel;
using System.Net.Security;
using System.ServiceModel.Description;
using System.Security.Cryptography.X509Certificates;
using System.Runtime.Serialization;
Imports System.ServiceModel
Imports System.Net.Security
Imports System.ServiceModel.Description
Imports System.Security.Cryptography.X509Certificates
Imports System.Runtime.Serialization