Практическое руководство. Использование безопасной передачи сообщений с помощью почтового транспорта WCF Exchange Server
Обновлен: Ноябрь 2007
В этом примере показано использование безопасной передачи сообщений по протоколу SOAP с помощью почтового транспорта Windows Communication Foundation (WCF) Exchange Server.
Пример
Следующий пример запускается на настольном компьютере. В нем показано, как отправлять и получать сообщения, используя безопасную передачу сообщений.
Предполагается, что в хранилище сертификатов есть сертификат от доверенного источника и что ссылки на сертификат в коде были соответствующим образом обновлены.
При создании сообщения необходимо выполнить сериализацию сообщения в вызове метода CreateMessage, передавая пользовательский сериализатор в качестве дополнительного параметра. На настольном компьютере можно использовать пользовательский сериализатор или атрибуты для создания сериализованных данных. Однако рекомендуется использование одного и того же сериализатора для мобильного устройства и настольного компьютера.
Пользовательский сериализатор не характерен для почтового транспорта сервера WCF Exchange Server и в этом примере не рассматривается. Пример пользовательского сериализатора см. в разделе Пошаговое руководство. Сериализация сообщений в приложениях WCF.
Class Program
Private Shared ChannelName As String = "Channel1"
Private Shared ServiceEmailAddress As String = "service@fabrikam.com"
Private Shared serializer As New CFMessagingSerializer(GetType(String))
Shared Sub Main(ByVal args() As String)
Dim factory As IChannelFactory(Of IOutputChannel)
Dim output As IOutputChannel
Dim bpc As BindingParameterCollection
Dim message As Message
Dim binding As ExchangeWebServiceMailBinding
Dim clientEmailServer As New Uri("http://mail.example.com")
Dim clientEmailAddress As String = "client@example.com"
Dim password As String = "password"
binding = New ExchangeWebServiceMailBinding(clientEmailServer, New NetworkCredential(clientEmailAddress, password))
binding.Security.Mode = MailSecurityMode.Message
bpc = New BindingParameterCollection()
Dim cc As New ClientCredentials()
cc.ClientCertificate.SetCertificate(System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser, System.Security.Cryptography.X509Certificates.StoreName.My, System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName, "example.com")
cc.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.ChainTrust
cc.ServiceCertificate.SetDefaultCertificate(System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser, System.Security.Cryptography.X509Certificates.StoreName.My, System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName, "fabrikam.com")
Dim cpr As New ChannelProtectionRequirements()
' Sign and encrypt body for *all* messages
cpr.OutgoingSignatureParts.AddParts(New MessagePartSpecification(True), "*")
cpr.IncomingSignatureParts.AddParts(New MessagePartSpecification(True), "*")
cpr.OutgoingEncryptionParts.AddParts(New MessagePartSpecification(True), "*")
cpr.IncomingEncryptionParts.AddParts(New MessagePartSpecification(True), "*")
bpc.Add(cc)
bpc.Add(cpr)
factory = binding.BuildChannelFactory(Of IOutputChannel)(bpc)
factory.Open()
Dim sendAddress As New EndpointAddress(MailUriHelper.CreateUri(ChannelName, ServiceEmailAddress), EndpointIdentity.CreateX509CertificateIdentity(cc.ServiceCertificate.DefaultCertificate))
output = factory.CreateChannel(sendAddress)
message = System.ServiceModel.Channels.Message.CreateMessage(MessageVersion.Default, "urn:Test", "Hello, World!", serializer)
output.Open()
output.Send(message)
output.Close()
factory.Close()
binding.Close()
' Receiving message on the server side
'
Dim listener As IChannelListener(Of IInputChannel)
Dim input As IInputChannel
Dim serviceEmailServer As New Uri("http://mail.fabrikam.com")
binding = New ExchangeWebServiceMailBinding(serviceEmailServer, New NetworkCredential(ServiceEmailAddress, password), MailSecurityMode.Message)
' Create credential for the listening side
Dim sc As New ServiceCredentials()
sc.ServiceCertificate.SetCertificate(System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser, System.Security.Cryptography.X509Certificates.StoreName.My, System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName, "fabrikam.com")
sc.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None
bpc = New BindingParameterCollection()
bpc.Add(sc)
bpc.Add(cpr)
listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(ChannelName, ""))
listener.Open()
input = listener.AcceptChannel()
input.Open()
message = input.Receive()
Dim data As String = message.GetBody(Of String)(serializer)
input.Close()
listener.Close()
binding.Close()
End Sub
End Class
class Program
{
private static string ChannelName = "Channel1";
private static string ServiceEmailAddress = "service@fabrikam.com";
private static CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));
static void Main(string[] args)
{
IChannelFactory<IOutputChannel> factory;
IOutputChannel output;
BindingParameterCollection bpc;
Message message;
ExchangeWebServiceMailBinding binding;
Uri clientEmailServer = new Uri("http://mail.example.com");
string clientEmailAddress = "client@example.com";
string password = "password";
binding = new ExchangeWebServiceMailBinding(clientEmailServer,
new NetworkCredential(clientEmailAddress, password));
binding.Security.Mode = MailSecurityMode.Message;
bpc = new BindingParameterCollection();
ClientCredentials cc = new ClientCredentials();
cc.ClientCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
"example.com");
cc.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.ChainTrust;
cc.ServiceCertificate.SetDefaultCertificate(System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My, System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
"fabrikam.com");
ChannelProtectionRequirements cpr = new ChannelProtectionRequirements();
// Sign and encrypt body for *all* messages
cpr.OutgoingSignatureParts.AddParts(new MessagePartSpecification(true), "*");
cpr.IncomingSignatureParts.AddParts(new MessagePartSpecification(true), "*");
cpr.OutgoingEncryptionParts.AddParts(new MessagePartSpecification(true), "*");
cpr.IncomingEncryptionParts.AddParts(new MessagePartSpecification(true), "*");
bpc.Add(cc);
bpc.Add(cpr);
factory = binding.BuildChannelFactory<IOutputChannel>(bpc);
factory.Open();
EndpointAddress sendAddress = new EndpointAddress(MailUriHelper.CreateUri(ChannelName,
ServiceEmailAddress), EndpointIdentity.CreateX509CertificateIdentity(cc.ServiceCertificate.DefaultCertificate));
output = factory.CreateChannel(sendAddress);
message = Message.CreateMessage(MessageVersion.Default, "urn:Test", "Hello, World!", serializer);
output.Open();
output.Send(message);
output.Close();
factory.Close();
binding.Close();
// Receiving message on the server side
//
IChannelListener<IInputChannel> listener;
IInputChannel input;
Uri serviceEmailServer = new Uri("http://mail.fabrikam.com");
binding = new ExchangeWebServiceMailBinding(serviceEmailServer,
new NetworkCredential(ServiceEmailAddress, password),
MailSecurityMode.Message);
// Create credential for the listening side
ServiceCredentials sc = new ServiceCredentials();
sc.ServiceCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
"fabrikam.com");
sc.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
bpc = new BindingParameterCollection();
bpc.Add(sc);
bpc.Add(cpr);
listener = binding.BuildChannelListener<IInputChannel>(MailUriHelper.CreateUri(ChannelName, ""), bpc);
listener.Open();
input = listener.AcceptChannel();
input.Open();
message = input.Receive();
string data = message.GetBody<string>(serializer);
input.Close();
listener.Close();
binding.Close();
}
}
Компиляция кода
Для этого примера требуются ссылки на следующие пространства имен:
Безопасность
(Дополнительные сведения о параметрах безопасности см. в разделе Почтовый транспорт WCF Exchange Server.)
См. также
Задачи
Пошаговое руководство. Использование почтового транспорта WCF Exchange Server
Другие ресурсы
Разработка Windows Communication Foundation и .NET Compact Framework