방법: 메시지 보안을 WCF Exchange Server 메일 전송에 사용
업데이트: 2007년 11월
이 예제에서는 WCF(Windows Communication Foundation) Exchange Server 메일 전송에 SOAP 메시지 보안을 사용하는 방법을 보여 줍니다.
예제
데스크톱에서 실행되는 다음 예제에서는 메시지 보안을 사용하여 메시지를 보내고 받는 방법을 보여 줍니다.
이 예제에서는 신뢰할 수 있는 소스의 인증서가 인증서 저장소에 있고 코드에서 이 인증서에 대한 참조가 적절하게 업데이트되었다고 가정합니다.
메시지를 만들 때는 사용자 지정 serializer를 추가 매개 변수로 전달하여 메시지를 CreateMessage 호출에 serialize해야 합니다. 데스크톱에서는 사용자 지정 serializer 또는 특성을 사용하여 serialize된 데이터를 만들 수 있습니다. 그러나 장치와 데스크톱에는 같은 serializer를 사용하는 것이 좋습니다.
사용자 지정 serializer는 WCF Exchange Server 메일 전송의 고유한 요소가 아니므로 이 예제에 포함되지 않았습니다. 사용자 지정 serializer의 예제를 보려면 방법: WCF 응용 프로그램의 메시지 serialize를 참조하십시오.
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 메일 전송 사용
기타 리소스
WCF(Windows Communication Foundation) 개발 및 .NET Compact Framework