2012-06-20 3 views
22

동일한 도메인/동일한 asp.net 응용 프로그램에서 암호로 보호 된 웹 페이지에 액세스하려고합니다. 이 통화 및 액세스중인 웹 페이지를 실행하는 웹 페이지에 대한 자격 증명은 모두 동일합니다.웹 클라이언트가 자격 증명이있는 페이지에 액세스 중

여기 코드가 있는데 왜 항상 로그인 양식 HTML 코드로 끝나는 지 모르겠습니다.

using (WebClient client = new WebClient()) 
{ 
    client.QueryString.Add("ID", "1040"); //add parameters 
    //client.Credentials = CredentialCache.DefaultCredentials; 
    //I tried to add credentials like this 
    client.Credentials = new NetworkCredential("username", "password"); 

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 
+0

왜 페이지로 리디렉션하지 않습니까? 서버 프로세스에서 코드를 사용하여 다운로드하면 동일한 자격 증명을 사용하지 않는 것입니다. 브라우저 (클라이언트 자격 증명 포함)가 페이지에 액세스하는 것보다 올바르게 이해하면 다른 시스템 (서버)의 다른 프로세스가이를 다운로드하여 클라이언트에게 표시합니다! – shambulator

+0

웹 페이지에 제공된 자격 증명은 어떻게 제공됩니까? 폼 인증을 사용합니까? –

+0

@shambulator 해당 페이지로 리디렉션한다는 것은 무엇을 의미합니까? 그 페이지의 html 코드를 얻으려고합니다. – mko

답변

48

나는 액세스하려는 웹 페이지가 양식 인증을 사용한다고 생각합니다. 즉, 보호 된 리소스에 액세스하려면 올바른 인증 쿠키를 제공해야합니다. 그리고 유효한 인증 쿠키를 얻으려면 먼저 쿠키를 내보내는 LogOn 페이지에 POST 요청을 보내 자신을 인증해야합니다. 일단 쿠키를 검색하면 보호 자원에 대한 후속 요청시이를 전송할 수 있습니다. 상자 WebClient은 쿠키를 지원하지 않습니다. 때문에 ASP.NET의 ViewState에의 crapiness에 분명히

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "username", "john" }, 
     { "password", "secret" }, 
    }; 
    client.UploadValues("http://domain.loc/logon.aspx", values); 

    // If the previous call succeeded we now have a valid authentication cookie 
    // so we could download the protected page 
    string result = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 

:

public class CookieAwareWebClient : WebClient 
{ 
    public CookieAwareWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
    } 
    public CookieContainer CookieContainer { get; private set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.CookieContainer = CookieContainer; 
     return request; 
    } 
} 

지금 당신이이 개 요청을 해고하기 위해 클라이언트를 사용할 수 있습니다 이러한 이유로 사용자 정의 쿠키 인식 웹 클라이언트를 작성할 수 로그온 요청을 따라 몇 가지 다른 매개 변수를 보내야 할 수도 있습니다. 다음과 같이 할 수 있습니다. 웹 브라우저에서 인증하고 보내야 할 정확한 매개 변수와 헤더를 FireBug에서 확인하십시오.

+0

깨끗하고 깨끗한 솔루션입니다. 로그인 콜렉션의 이름은 실제로 사용자 이름과 비밀번호 여야합니까? 그리고 폼 기반의 인증이라는 사실에도 불구하고 현재의 자격 증명을 사용하는 응용 프로그램의 다른 방법이 있습니다. – mko

+0

@ 존, 로그인 이름이 사용자 이름과 비밀번호 여야하는지 모르겠습니다. 이는 전적으로 로그온 페이지의 구현 방법과 예상 매개 변수에 달려 있습니다. 그리고, 다른 방법은 없습니다. 유효한 폼 인증 쿠키를 얻어야하며 이러한 쿠키를 얻는 유일한 방법은 로그온 페이지에 올바른 자격 증명을 제공하는 것입니다. 양식 인증 쿠키를내는 것은이 페이지 (희망 사항 :-))입니다. –

+0

코드가 작동하지 않지만 아이디어를 이해하고 작동하도록 노력할 것입니다. – mko

관련 문제