http://umc.pe.kr/article_79.aspx 아티클을 통해 FTP 로 파일을 업로드/다운로드 방법을 설명한 바 있다. FTP 의 인증 과정을 거쳐 특정 폴더의 파일에 접근 할 수 있다.
CredentialCache
그렇다면 우리는 CredentialCache 라는 클래스를 눈여겨 볼 수 있다. 이 클래스를 한마디로 표현하자면 “여러 자격 증명을 저장하기 위한 저공소”이다. CredentialCache 클래스의 GetCredential 메서드를 이용하여 URI 와 인증형식등을 지정하면, 가장 유사한 자격증명을 제공받을 수 있다.
CredentialCache cCache = new CredentialCache();
cCache.Add(new Uri("ftp://umc.pe.kr/www/a.txt"), "Basic", new NetworkCredential("ID","PASSWORD") ); |
CredentialCache 클래스를 사용하여 자격 인증을 캐시에 저장한다. |
위의 코드는 특정 URI 의 Basic(기본) 인증 방식으로 자격 인증이 생성되었다.
“Basic” 을 “Digest” 라고 바꾸어주면 다이제스트 인증을 할 수 있다.
기본 및 다이제스트 인증 방식은 전송되는 데이터가 암호화가 되지 않으며, 기본 인증방식은 사용자의 아이디 및 패스워드는 보안되지 않은 상태로 전송된다. |
그렇다면 웹(ASP.NET) 에서도 CredentialCache 클래스를 이용하여 자격 인증의 상태를 보존할 수 있을까?
언듯, 클래스의 이름이 말해주듯 Cache 라는 말에 혹해버린다면 곧바로 난관에 부딪혀 버릴것이다. 물론 static 한정자로 정적 맴버를 만든다면 맴버가 초기화 되거나, 가비지컬렉터에 의해 수집이 되지 않는한 상태를 보존할 수 있겠으나, 여기에서도 문제가 따른다.
즉, 웹 어플케이션 차원에서 공용되는 맴버이므로, 사용자별 자격 인증을 저장하기엔 매우 부적합 하다.
Sample
그럼 어떻게 구현했는지 샘플을 보도록 하자.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>제목 없음</title>
</head>
<body>
<form id="form1" runat="server">
<div>
FTP 주소 : <asp:TextBox ID="txtFtp" runat="server" MaxLength="100" Width="521px"></asp:TextBox>
<br />
<br />
User ID :
<asp:TextBox ID="txtID" runat="server"></asp:TextBox><br />
Password :
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
<br />
<br />
<asp:Button ID="btnConnection" runat="server" Text="Connection" OnClick="btnConnection_Click" />
<asp:Button ID="btnCacheClear" runat="server" Text="Cache Clear" OnClick="btnCacheClear_Click" />
<p></p>
<asp:Label ID="lblCache" runat="server"></asp:Label>
<p></p>
<asp:Label ID="lblData" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
|
Default.aspx |
Html 부분은 특별히 설명할 것이 없으므로, CS 코드를 보자
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Drawing;
public partial class _Default : System.Web.UI.Page
{
///<summary>
/// Cache 및 Session 에 저장될 자격인증 키값
///</summary>
private static readonly string PARAM_CREDENTIALS_CACHE = "C";
private Uri thisUri = null;
protected void Page_Load(object sender, EventArgs e)
{
if( IsPostBack ) return;
txtFtp.Text = "FTP://umc.pe.kr:5830/www/r.txt";
}
protected void btnConnection_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
thisUri = new Uri( txtFtp.Text );
try
{
lblCache.Text = lblData.Text = string.Empty;
lblCache.ForeColor = Color.Red;
// Cache 및 Session 에 저장된 자격인증이 있는지 검사한다.
if (Cache[PARAM_CREDENTIALS_CACHE] == null)
{
NetworkCredential ct = new NetworkCredential(txtID.Text, txtPassword.Text);
client.Credentials = ct;
Cache[PARAM_CREDENTIALS_CACHE] = ct;
lblCache.Text = "Create Credential";
}
else
{
client.Credentials = (NetworkCredential)Cache[PARAM_CREDENTIALS_CACHE];
lblCache.Text = "Cache Credential";
lblCache.ForeColor = Color.Blue;
}
byte[] bData = client.DownloadData(txtFtp.Text);
string sData = System.Text.Encoding.Default.GetString(bData);
lblData.Text = sData;
}
catch (WebException)
{
btnCacheClear_Click(this, EventArgs.Empty);
lblCache.Text = "경로가 틀리거나, 인증되지 않았습니다";
}
}
protected void btnCacheClear_Click(object sender, EventArgs e)
{
// Cache 또는 Session 에 저장된 자격인증을 제거한다.
Cache.Remove( PARAM_CREDENTIALS_CACHE );
lblCache.Text = "Clear Cache";
lblCache.ForeColor = Color.Black;
}
}
|
Default.aspx.cs |
우선 위 예제는 Cache 를 이용하여 자격 인증을 저장해 보았다.
하지만 Cache 또한 Session 과 달리 사용자별로 값을 저장하지 않기 때문에, 두개의 브라우져를 띄웠을 경우, 분명 다른 세션이기 때문에, 첫번째 브라우져에서 FTP 를 인증하게 되면, 두번째 브라우져는 인증도 하지 않음에도 인증되어 버린다.
만약, 사용자별로 자격 인증 상태를 저장하기 위해서는 Session 을 사용하면 된다.
소스의 Cache 를 Session 으로 바꾸어 주기만 하면 된다.
NetworkCredential 클래스를 ViewState 에 저장할 수 없다. 왜냐하면 ViewState는 Serializable 된 개체를 담을 수 있기 때문이다. |
아마도 잘 응용 한다면, Active-X 를 사용하지 않는 FTP 관리 웹 어플케이션도 도전해 볼만 하다고 생각해본다.
'.NET > ASP.NET' 카테고리의 다른 글
ASPX 확장명 변경과 Visual Studio 에 적용하기 (0) | 2008.04.06 |
---|---|
웹사이트를 웹 응용 프로그램으로 변환하기 (2) | 2007.11.10 |
FTP 자격인증을 저장하는 방법 (0) | 2007.07.29 |
delegate 를 이용한 게시판 구성 (1) | 2007.07.24 |
너 ASPX 웹폼 확장자를 바꿔봤니? 난 해봤~어! (0) | 2007.04.09 |
Composite Pattern 을 사용하여 MVC Pattern 구현 (0) | 2007.04.06 |