■ WCF 인증서를 인증하는 방법을 보여준다.
[TestServer 프로젝트]
▶ ISimpleService.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System.ServiceModel; namespace TestServer { /// <summary> /// 단순 서비스 인터페이스 /// </summary> [ServiceContract] public interface ISimpleService { //////////////////////////////////////////////////////////////////////////////////////////////////// Method #region 사용자명 구하기 - GetUserName() /// <summary> /// 사용자명 구하기 /// </summary> /// <returns>사용자명</returns> [OperationContract] string GetUserName(); #endregion } } |
▶ SimpleService.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<?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> |