안녕하세요.
오늘은 C# 에서 간단히 Digest 인증까지 지원해주는 Http Server 에 대해서 포스팅해보려고 합니다.
archive.codeplex.com/?p=webserver
저는 위의 링크의 Griffin.WebServer 를 이용해서 구축했습니다.
참고로 Nuget 패키지에서도 패키지를 설치하실 수 있습니다.
webserver\sourceCode\sourceCode\branches\1.x
다운로드를 받고 해당 소스 코드로 구축해보았습니다.
(프로젝트를 추가하고 참조하는 방식으로 구성하였습니다.)
먼저 다운받은 프로젝트를 추가합니다.
HttpServer 를 사용할 원래 프로젝트에 HttpServer 를 참조 추가합니다.
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 프로젝트에 튜토리얼로 다른 예제도 같이 프로젝트에 있으니 필요하시면 튜토리얼의 소스코드를 보시고 활용하시면 좋겠습니다.
테스트 내용을 보시면, 정상적으로 Digest 인증이 된 것을 확인하실 수 있습니다.
이상 C# 프로젝트에서 간단히 HttpServer 를 올릴 수 있는 방법을 소개해보았습니다.
그럼 20000.
C# Json String 데이터 파싱하기, Newtonsoft.Json (0) | 2020.10.29 |
---|---|
C언어 문자열 파싱 함수 strtok 사용 방법과 원리(예제포함) (0) | 2020.10.27 |
C# Nuget ZMQ, ZMQ Recv (0) | 2020.09.01 |
C언어 문자열 관련 함수 strcpy, strncpy, sprintf, snprintf, strcat, strncat (4) | 2020.04.13 |
C언어 memset, memcpy 메모리(데이터) 초기화 및 복사 (4) | 2020.04.09 |