Young & Rich

 

안녕하세요.

 

오늘은 C# 에서 간단히 Digest 인증까지 지원해주는 Http Server 에 대해서 포스팅해보려고 합니다.

archive.codeplex.com/?p=webserver

 

CodePlex Archive

An archive of the CodePlex open source hosting site

archive.codeplex.com

저는 위의 링크의 Griffin.WebServer 를 이용해서 구축했습니다.

참고로 Nuget 패키지에서도 패키지를 설치하실 수 있습니다.

 

webserver\sourceCode\sourceCode\branches\1.x

 

다운로드를 받고 해당 소스 코드로 구축해보았습니다.

(프로젝트를 추가하고 참조하는 방식으로 구성하였습니다.)

 

1. 프로젝트 추가

 

프로젝트 추가

 

먼저 다운받은 프로젝트를 추가합니다.

 

참조 추가

 

HttpServer 추가

 

HttpServer 를 사용할 원래 프로젝트에 HttpServer 를 참조 추가합니다.

 

 

 

2. HTTP Digest 예제

using HttpServer;
using HttpServer.Authentication;
using System.Net;
using HttpServer.HttpModules;
using System.IO;
using HttpServer.Sessions;

namespace Test_APP
{
    public partial class MainWindow : Window
    {
        class User
        {
            public int id;
            public string userName;
            public User(int id, string userName)
            {
                this.id = id;
                this.userName = userName;
            }
        }

        class MyModule : HttpModule
        {
            /// <summary>
            /// Method that process the URL
            /// </summary>
            /// <param name="request">Information sent by the browser about the request</param>
            /// <param name="response">Information that is being sent back to the client.</param>
            /// <param name="session">Session used to </param>
            /// <returns>true if this module handled the request.</returns>
            public override bool Process(IHttpRequest request, IHttpResponse response, IHttpSession session)
            {
            	// 실제 Response 를 어떻게 줄지 데이터를 처리합니다.
                if (request.Uri.AbsolutePath.StartsWith("/test"))
                {
                    StreamWriter writer = new StreamWriter(response.Body);
                    writer.WriteLine("Result=Success");
                    writer.Flush();
                }
                else
                    return false;

                // return true to tell webserver that we've handled the url
                return true;
            }
        }

        private HttpServer.HttpServer _server;
        private string m_username;
        private string m_password;
        
        public Test_APP()
        {
            InitializeComponent();
            
            m_username = "admin";
            m_password = "12345678";
            
            Thread th = new Thread(new ThreadStart(Http_server_th));
            th.Start();
        }
        
        private void Http_server_th()
        {
            _server = new HttpServer.HttpServer();

            _server.Add(new MyModule());
            DigestAuthentication auth = new DigestAuthentication(OnAuthenticate, OnAuthenticationRequired);
            _server.AuthenticationModules.Add(auth);

            _server.Start(IPAddress.Any, 8081);
        }
        
        private bool OnAuthenticationRequired(IHttpRequest request)
        {
        	// True or False 에 따라 인증을 하냐 안하냐를 리턴해주는 코드입니다.
            // Urlㅣ 별로 인증 여부를 결정합니다.
            return request.Uri.AbsolutePath.StartsWith("/test");
        }

        private void OnAuthenticate(string realm, string userName, ref string password, out object login)
        {	
        	// 사용자 별로 다른 패스워드로 인증을 하도록 동작시킬 수 있습니다.
            if (userName == m_username)
            {
                password = m_password;

                // login can be fetched from IHttpSession in all modules
                login = new User(1, m_username);
            }
            else
            {
                password = string.Empty;
                login = null;
            }
        }
    }
}

 

* private bool OnAuthenticationRequired(IHttpRequest request)

- URL 별로 인증을 할 것인지 결정.

 

* private void OnAuthenticate(string realm, string userName, ref string password, out object login)

- 사용자(ID) 별로 Password 인증을 다르게 설정 가능.

 

* public override bool Process(IHttpRequest request, IHttpResponse response, IHttpSession session)

- 인증 성공 또는 None Auth 일 경우 Response 를 채워주는 구현부.

 

HttpServer 프로젝트에 튜토리얼로 다른 예제도 같이 프로젝트에 있으니 필요하시면 튜토리얼의 소스코드를 보시고 활용하시면 좋겠습니다.

 

 

 

3. 테스트

URL 요청

 

테스트 결과

 

패킷캡처

 

테스트 내용을 보시면, 정상적으로 Digest 인증이 된 것을 확인하실 수 있습니다.

 

이상 C# 프로젝트에서 간단히 HttpServer 를 올릴 수 있는 방법을 소개해보았습니다.

 

그럼 20000.

 

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band