2011-01-12 5 views
25

왜 내 asp.net 응용 프로그램이 'Authorization'이라는 이름으로 내 게시물에 헤더를 추가하지 않지만 "인증"과 같이 한 문자를 변경하면 제대로 작동하는지 알고 싶습니다. 다른 사이트의 문서에서 그들은 항상 "Authorization"이라는 이름을 사용합니다. 그래서이 시점에서 나는 단지 그 이유를 알고 싶습니다.ASP.NET HTTP 인증 헤더

나는 이것에 대해 몇 가지 주제를 읽었지만 어떠한 논리적 인 이유도 발견하지 못했습니다.

여기 아래에있는 내 코드입니다 :

string fileName = "c:\\xyz.xml"; 
string uri = "http://myserver/Default.aspx"; 
req = WebRequest.Create(uri); 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
byte[] authBytes = Encoding.UTF8.GetBytes("DDSServices:jCole2011".ToCharArray()); 
req.Headers.Add("Authorization", "BASIC " + Convert.ToBase64String(authBytes)); 
req.Headers.Add("test", "test"); 
UTF8Encoding encoder = new UTF8Encoding(); 
byte[] data = encoder.GetBytes(this.GetTextFromXMLFile(fileName)); 
req.ContentLength = data.Length; 
Stream reqStream = req.GetRequestStream(); 
reqStream.Write(data, 0, data.Length); 
reqStream.Close(); 
req.Headers.Add("Authorization", "BASIC" + Convert.ToBase64String(authBytes)); 
System.Net.WebResponse response = req.GetResponse(); 
System.IO.StreamReader reader = new StreamReader(response.GetResponseStream()); 
string str = reader.ReadToEnd(); 

다른이 내가 피들러를 통해 감시 변수를 추가 할 때 잘 작동이다 성가신.

답변

11

HTTP 기본 인증의 경우 Credentials 속성을 사용해야합니다.

req.Credentials = new NetworkCredential("DDSServices", "jCole2011");

이것은 당신이 원하는 일을해야한다. Authorization 헤더를 설정하는 것이 아닙니다.

+0

이거나 거기 논리적 인 이유? 우리가 함께 일하는 매우 큰 제 3의 회사는 같은 방식으로 승인을받은 문서를 가지고 있으므로 그 이유를 알고 싶습니다. – Cody

+1

Will이 제시 한대로 NetworkCredential 방식을 이용하는 것이 훨씬 낫습니다. 그러나 GetRequestStream을 호출하기 전에 jsut 한 번 수행해야합니다. GetRequestStream 호출하기 전에 한 번 두 번 GetRquestStream 호출하기 전에 한 두 번 일을 이해하지 못합니다 있지만 잘 작동해야합니다. 추적 로그. 지침 http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html – feroze

+0

왜 더 나은지 말해 줄 수 있습니까? 아니면 내가 더 나은 이유에 대해 읽을 수있는 곳입니까? NetworkCredentials는 광고 또는 폼 인증으로 묶여있는 것 같아요. 익명을 통해 연결하는 것이 좋을 것입니다. 어느 쪽이든 누군가 나에게 이유를 말해 줄 수 있습니까?이 시점에서 나는 거의 신경 쓰지 않아도됩니다. – Cody

3

NetworkCredential은 좋은 솔루션이지만 호출하는 사이트는 권한이없는 401 및 응답의 WWW-Authenticate 헤더를 처리해야합니다.

클라이언트 :

request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}}; 

서버 :

Response.ClearContent(); 
Response.StatusCode = 401; 
Response.AddHeader("WWW-Authenticate", "Basic"); 
Response.End(); 

이 서버에 2 안타 발생합니다. 초기 호출은 자격 증명없이 서버로 이동합니다. 서버가 401 및 WWW-Authenticate 헤더 (인증 유형 필요)로 응답하면 요청의 자격 증명을 사용하여 요청을 다시 보냅니다.

+3

이것은 사실이지만 401 Unauthorized를 돌려 보내며 WWW-Authenticate 헤더는 HTTP Spec의 일부입니다. 첫 번째 요청에서 강제로 헤더를 보내려면 PreAuthenticate 메소드를 통해 그렇게 할 수 있습니다. 추가로 - IIS는 자동으로 Apache와 같은 잘 작성된 HTTP 서버와 마찬가지로이 응답을 다시 처리합니다. 브라우저가 암호 프롬프트 대화 상자를 표시하는 방법입니다. –

41

인증/자격 증명을 헤더에 추가하는 방법에 대한 질문이 생겼습니다. 다음과 같은 방법으로 해결책을 찾았습니다. 나에게 내가 (붙여 넣기 와이어 샤크 설명) 원하는 그 헤더를 준

string _auth = string.Format("{0}:{1}", "myUser","myPwd"); 
string _enc = Convert.ToBase64String(Encoding.ASCII.GetBytes(_auth)); 
string _cred = string.Format("{0} {1}", "Basic", _enc); 
req.Headers[HttpRequestHeader.Authorization] = _cred; 

,

인증 : 기본 bXlVc2VyOm15UHdk \ 연구 \ n
자격 증명 : 참고 MyUser : myPwd

+0

그럼 인코딩이 ASCII인지 확실히 어떻게 알 수 있습니까? –

+1

좋은 지적. 선택한 인코딩은 "찾기 어렵습니다"- 버그의 소스처럼 보입니다. 독자들에게 결정하는 방법에 대한 자세한 정보는 http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication 링크를 추가하십시오. – Independent