Compartilhar via


Como: Usar segurança de mensagens com o WCF transporte do Exchange servidor email

Este exemplo mostra como usar a segurança da mensagem SOAP com a Windows Communication Foundation (WCF) Transporte de email do Exchange servidor.

Exemplo

O exemplo a seguir é executado na área de trabalho e mostra como enviar e receber uma mensagem usando a segurança de mensagem.

Este exemplo assume que um certificado de uma fonte confiável está presente no armazenamento de certificados e referências para o certificado no código foram atualizadas corretamente.

Quando você cria uma mensagem, você deve serializar a mensagem o CreateMessage Chame passando um serializador personalizado sistema autônomo um parâmetro extra. Na área de trabalho, você pode usar um serializador personalizado ou atributos para criar dados serializados.No entanto, recomendamos que você use o mesmo serializador para o dispositivo e a área de trabalho.

O serializador personalizado não é específico para o transporte de email do Exchange servidor do WCF e não está incluído neste exemplo.Para obter um exemplo de um serializador personalizado, consulte Como: Serializar mensagens em aplicativos do 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();

    }
}

Compilando o código

Este exemplo requer referências aos seguintes namespaces:

Segurança

Para obter mais informações sobre opções de segurança, consulte WCF transporte do Exchange servidor email.

Consulte também

Tarefas

Demonstra Passo a passo: Usando o transporte de mensagem WCF Exchange servidor

Outros recursos

Desenvolvimento do Windows Communication Foundation (WCF) e o .NET Compact estrutura