2009-12-05 2 views
2

요즘 나는 성가신 인증 체계를 사용하는 무선 네트워크를 통해 사무실에서 일하고 있습니다. 몇 시간에 한 번씩 브라우저를 열고 인증 웹 페이지에 사용자 이름/암호를 입력하거나 네트워크 액세스를 잃게됩니다. 시간이 만료되면 다음 브라우저 요청이 승인 페이지로 리디렉션되고, 귀하의 신용 정보가 소집 된 경우 원래 페이지로 다시 연결됩니다..NET 또는 Win32에서 재사용 할 수있는 "자격 증명 저장"대화 상자 (예 : IE 또는 Vista)

이러한 종류의 성가심은 공항이나 커피 숍 무선으로는 좋지만 사무실에서는 특히 네트워크 서비스 (예 : SVN, 전자 메일)로 작업하는 경우 갑자기 몇 시간마다 작동을 멈추지 않으면 당신은 브라우저를 가져옵니다.

그래서 나는 내 자격 증명으로 로그인 양식에 HTTP 요청을 보내서 저를 위해 로그인 할 작은 C# 콘솔 응용 프로그램을 작성했습니다.

이것은 분명히 안전하지 않습니다. 내 암호가 모든 사람이 볼 수 있도록 내 소스 코드 안에 있습니다. IE와 같은 메커니즘을 사용하여 내 자격 증명을 저장할 수 있기를 원합니다. 예를 들어 웹 양식에서 비밀번호를 저장하고 다시 채우는 데 사용합니다.

이상적으로, 자격 증명을 입력, 저장 및 검색하는 데 필요한 재사용 가능한 구성 요소 (선택 사항 인 "cred creds"확인란 포함)를 사용하면 응용 프로그램에서 간단하게 이와 유사한 작업을 수행 할 수 있습니다. :

// retrieve any saved credentials from some secure place 
Credentials creds = GetCreds(some parameters go here); 

// if none stored, then show the user an "enter and optionally save credentials" dialog 
if (creds == null) 
    creds = GetCredsDialog(some parameters go here); 

// POST to the authentication page 
if (creds != null) 
{ 
    string authUrl = "https://somehost/login/"; 
    string postDataPattern = "post data pattern here"; 

    // use SecureString here instead? 
    string postData = string.Format (postDataPattern, HttpUtility.HtmlEncode(creds.Username), HttpUtility.HtmlEncode(creds.Password)); 
    WebClient wc = new WebClient(); 
    string html = wc.UploadString (authUrl, "POST", postData); 

    // TODO: if html indicates login failure, clear stored credentials 
    // and ask for new creds. then retry. 
} 

는 기본적으로 나는 윈도우 사람이 나는 것보다이 더 잘 될 것이라는 가정하에, 윈도우에 내 응용 프로그램에서 안전하게 저장 creds의 부담을 이동하려는. :-)

저는 철저한 보안을 찾고 있지 않습니다. IE가 다른 웹 사이트의 다른 저장된 암호를 보호하기 위해 사용하는 것과 비슷합니다. 난 그냥 내 코드에 일반 텍스트 암호를 유지하고 싶지 않아!

물론 올바른 솔루션은 IT 부서에서 무선에 대한 실제 인증 스키마를 얻는 것이지만 그 동안에는 스스로 해결할 수 있습니다.

.NET 솔루션이 좋겠지 만 Win32 솔루션도 괜찮을 것입니다. C++로 간단하게 포트 할 수 있습니다.

답변

5

자격 증명을 저장하려면 System.Security.dll에서 ProtectedData 클래스를 사용하십시오.
DataProtectionScope.CurrentUser을 전달하면 다른 사용자가 데이터를 해독 할 수 없습니다.

편집는 : 대화 상자를 들어,

는 닷넷 래퍼 here를 참조 CredUIPromptForCredentials API 기능을 사용할 수 있습니다.

+1

이것은 .NET에서 가장 훌륭하고 가장 유용한 암호화 클래스 중 하나입니다. 그게 발표되었을 때 백만명의 개발자 내부 정적 클래스는 영예로운 죽음을 맞았습니다. – Josh

+0

기계간에 데이터를 전송해야하는 경우가 아니면 – SLaks

+0

분명히, "나는 내 자신의 앱을위한 데이터를 보호해야한다"는 것보다 덜 일반적인 시나리오이다. – Josh