■ WCF 인증서 인증 사용하기

----------------------------------------------------------------------------------------------------


TestSolution.zip


[TestServer 프로젝트]

 

ISimpleService.cs

 

 

using System.ServiceModel;

 

namespace TestServer

{

    /// <summary>

    /// 단순 서비스 인터페이스

    /// </summary>

    [ServiceContract]

    public interface ISimpleService

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

 

        #region 사용자명 구하기 - GetUserName()

 

        /// <summary>

        /// 사용자명 구하기

        /// </summary>

        /// <returns>사용자명</returns>

        [OperationContract]

        string GetUserName();

 

        #endregion

    }

}

 

 

SimpleService.cs

 

 

using System;

using System.ServiceModel;

 

namespace TestServer

{

    /// <summary>

    /// 단순 서비스

    /// </summary>

    public class SimpleService : ISimpleService

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 사용자명 구하기 - GetUserName()

 

        /// <summary>

        /// 사용자명 구하기

        /// </summary>

        /// <returns>사용자명</returns>

        public string GetUserName()

        {

            bool   isAuthenticated    = ServiceSecurityContext.Current.PrimaryIdentity.IsAuthenticated;

            string authenticationType = ServiceSecurityContext.Current.PrimaryIdentity.AuthenticationType;

            string userName           = ServiceSecurityContext.Current.PrimaryIdentity.Name;

            

            Console.WriteLine("인증 여부 : {0}", isAuthenticated   );

            Console.WriteLine("인증 타입 : {0}", authenticationType);

            Console.WriteLine("사용자명  : {0}", userName          );

            

            return userName;

        }

 

        #endregion

    }

}

 

 

Program.cs

 

 

using System.ServiceModel;

using System;

 

namespace TestServer

{

    /// <summary>

    /// 프로그램

    /// </summary>

    class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region 프로그램 시작하기 - Main()

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        private static void Main()

        {

            using(ServiceHost serviceHost = new ServiceHost(typeof(SimpleService)))

            {

                serviceHost.Open();

 

                Console.WriteLine("서버가 시작되었습니다 : "DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

 

                Console.ReadKey(true);

            }

        }

 

        #endregion

    }

}

 

 

App.config

 

 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="mexBehavior">

                    <serviceMetadata httpGetEnabled="true" />

                    <serviceCredentials>

                        <clientCertificate>

                            <authentication certificateValidationMode="PeerTrust" />

                        </clientCertificate>

                        <serviceCertificate

                            findValue="WCFServer"

                            storeLocation="CurrentUser"

                            storeName="My"

                            x509FindType="FindBySubjectName" />

                    </serviceCredentials>

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <bindings>

            <wsHttpBinding>

                <binding name="wsHttp">

                    <security mode="Message">

                        <message clientCredentialType="Certificate" />

                    </security>

                </binding>

            </wsHttpBinding>

            <netTcpBinding>

                <binding name="netTcp">

                    <security mode="Message">

                        <message clientCredentialType="Certificate" />

                    </security>

                </binding>

            </netTcpBinding>

        </bindings>

        <services>

            <service name="TestServer.SimpleService" behaviorConfiguration="mexBehavior">

                <endpoint

                    address="SimpleService"

                    binding="wsHttpBinding"

                    bindingConfiguration="wsHttp"

                    contract="TestServer.ISimpleService" />

                <endpoint

                    address="SimpleService"

                    binding="netTcpBinding"

                    bindingConfiguration="netTcp"

                    contract="TestServer.ISimpleService" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8080" />

                        <add baseAddress="net.tcp://localhost:8090" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>

 

 

[TestClient 프로젝트]

 

MainForm.cs

 

 

using System;

using System.Windows.Forms;

 

using TestClient.SimpleService;

 

namespace TestClient

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : Form

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            this.callButton.Click += callButton_Click;

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region 호출하기 버튼 클릭시 처리하기 - callButton_Click(sender, e)

 

        /// <summary>

        /// 호출하기 버튼 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void callButton_Click(object sender, EventArgs e)

        {

            using(SimpleServiceClient client = new SimpleServiceClient("WSHttpBinding_ISimpleService"))

            {

                string userName = client.GetUserName();

 

                MessageBox.Show(userName);

            }

        }

 

        #endregion

    }

}

 

 

App.config

 

 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <startup>

        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

    </startup>

    <system.serviceModel>

        <behaviors>

            <endpointBehaviors>

                <behavior name="certificateBehavior">

                    <clientCredentials>

                        <clientCertificate

                            findValue="WCFClient"

                            storeLocation="CurrentUser"

                            storeName="My"

                            x509FindType="FindBySubjectName" />

                        <serviceCertificate>

                            <authentication certificateValidationMode="PeerTrust" />

                        </serviceCertificate>

                    </clientCredentials>

                </behavior>

            </endpointBehaviors>

        </behaviors>

        <bindings>

            <netTcpBinding>

                <binding name="NetTcpBinding_ISimpleService">

                    <security mode="Message">

                        <message clientCredentialType="Certificate" />

                    </security>

                </binding>

            </netTcpBinding>

            <wsHttpBinding>

                <binding name="WSHttpBinding_ISimpleService">

                    <security mode="Message">

                        <message clientCredentialType="Certificate" />

                    </security>

                </binding>

            </wsHttpBinding>

        </bindings>

        <client>

            <endpoint name="WSHttpBinding_ISimpleService"

                behaviorConfiguration="certificateBehavior"

                address="http://localhost:8080/SimpleService"

                binding="wsHttpBinding"

                bindingConfiguration="WSHttpBinding_ISimpleService"

                contract="SimpleService.ISimpleService">

                <identity>

                    <certificate encodedValue="AwAAAAEAAAAUAAAA/CZbeDwdDzqXgitnbganhdHxFZYgAAAAAQ

                                               AAALUBAAAwggGxMIIBX6ADAgECAhD7CT8Rmi9QuUeVFUSH7zL2

                                               MAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHh

                                               cNMTgwMjEyMTMxNjUzWhcNMzkxMjMxMjM1OTU5WjAUMRIwEAYD

                                               VQQDEwlXQ0ZTZXJ2ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMI

                                               GJAoGBAMOswBkEswxKK9WuX8YbXJth3xF0FVKe2d+vBqZjRO+S

                                               QyE1yyE1pXgD1nmMPtwl3HyfSoKouuiaf2fc1Rnvp2vDaNeVSG

                                               72Tkq6wHfb2Uol47gXcCJ2UcN/7tdcm5St/tbBUvzgS9EibtWf

                                               YdtGSvez+VSd6N8a6R/ylzeBns7BAgMBAAGjSzBJMEcGA1UdAQ

                                               RAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtS

                                               b290IEFnZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQ

                                               UAA0EANdZ6zWFh5pAERMhncGFyzxnHPHLmc1GmIcpbTidP6oa0

                                               VvsGltTVU1Vm3IBPPvHjKSsFMkUPyvF8GC5dveWGqw==" />

                </identity>

            </endpoint>

            <endpoint name="NetTcpBinding_ISimpleService"

                behaviorConfiguration="certificateBehavior"

                address="net.tcp://localhost:8090/SimpleService"

                binding="netTcpBinding"

                bindingConfiguration="NetTcpBinding_ISimpleService"

                contract="SimpleService.ISimpleService">

                <identity>

                    <certificate encodedValue="AwAAAAEAAAAUAAAA/CZbeDwdDzqXgitnbganhdHxFZYgAAAAAQ

                                               AAALUBAAAwggGxMIIBX6ADAgECAhD7CT8Rmi9QuUeVFUSH7zL2

                                               MAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHh

                                               cNMTgwMjEyMTMxNjUzWhcNMzkxMjMxMjM1OTU5WjAUMRIwEAYD

                                               VQQDEwlXQ0ZTZXJ2ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMI

                                               GJAoGBAMOswBkEswxKK9WuX8YbXJth3xF0FVKe2d+vBqZjRO+S

                                               QyE1yyE1pXgD1nmMPtwl3HyfSoKouuiaf2fc1Rnvp2vDaNeVSG

                                               72Tkq6wHfb2Uol47gXcCJ2UcN/7tdcm5St/tbBUvzgS9EibtWf

                                               YdtGSvez+VSd6N8a6R/ylzeBns7BAgMBAAGjSzBJMEcGA1UdAQ

                                               RAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtS

                                               b290IEFnZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQ

                                               UAA0EANdZ6zWFh5pAERMhncGFyzxnHPHLmc1GmIcpbTidP6oa0

                                               VvsGltTVU1Vm3IBPPvHjKSsFMkUPyvF8GC5dveWGqw==" />

                </identity>

            </endpoint>

        </client>

    </system.serviceModel>

</configuration>

 

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요