2011-01-12 27 views
25

Asp.net uygulamamın neden 'Yetkilendirme' olarak adlandırılırsa başlığımı neden eklemeyeceğimi, ancak bir karakteri değiştirdiğimde, "Yetkilendirmeler" deyip yazamayacağımı bilmek isterim. Diğer sitelerle ilgili dokümantasyonda her zaman "Yetkilendirme" adını kullanırlar, bu yüzden ben de iyi olmak isterim ve bu noktada neden sadece altında durmak istiyorum.ASP.NET HTTP Yetkilendirme Üstbilgisi

Bu konuyla ilgili birkaç konu okudum, ancak herhangi bir mantıksal neden bulamadı.

İşte aşağıda benim kodudur:

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(); 

diğer bu i fiddler aracılığıyla izledi değişkeni eklerken iyi çalışıyor ise can sıkıcı.

cevap

11

HTTP Temel Yetkilendirme için, Kimlik Bilgileri özelliğini kullanmalısınız.

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

İstediğin yapmalıdır. Yetkilendirme başlığını ayarlamak yerine.

+0

veya orada bir mantıksal sebep? Çalıştığımız çok büyük bir üçüncü şahıs firması yetkileri ile aynı şekilde belgelendirilmiş, bu yüzden nedenini bilmek isterim. – Cody

+1

Will'in önerdiği gibi NetworkCredential yaklaşımını kullanmak daha iyidir. Bununla birlikte, yaklaşımınız da iyi çalışmalı, neden iki kez yaptığınızı anlamıyorum (GetRquestStream'e bir çağrı yapmadan önce ve bir kez sonra. GetRequestStream'i çağırmadan önce bir kez daha jsut yapmalısınız. Eğer hala çalışmıyorsa, http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html adresindeki talimatlar – feroze

+0

Neden bunun neden daha iyi olduğunu söyleyebilir misiniz? Veya neden daha iyi olduğunu nereden okuyabiliyorum? NetworkCredentials reklam ya da formlar kimlik doğrulaması ile bağlı olurdu görünüyor, ben anonim aracılığıyla bağlantı yerine, sadece doğrulayın.Ya da olsa birisi bana sadece neden söyleyebilir misin? Neredeyse bu noktada ne olduğunu umurumda değil – Cody

3

NetworkCredential iyi bir çözümdür, ancak aradığınız sitenin yanıtta bir 401 VE WWW-Authenticate üstbilgisiyle yetkisiz bir şekilde işlemesi gerekir.

Müşteri:

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

Sunucu:

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

Bu sunucuya 2 hit sonuçlanacaktır. İlk çağrı, kimlik bilgileri olmadan sunucuya gider. Sunucu 401 ve WWW-Authenticate üstbilgisiyle (gerekli kimlik doğrulaması türünde) yanıt verdiğinde, istek istekte bulunan kimlik bilgileriyle yeniden gönderilir.

+3

Bu doğrudur, ancak 401 Yetkisiz olarak geri gönderilir ve WWW-Authenticate başlığı HTTP Spec'un bir parçasıdır. Başlığı ilk istekte göndermeye zorlamak istiyorsanız, bunu PreAuthenticate yöntemi ile yapabilirsiniz. Eklemede - IIS, Apache gibi iyi yazılmış HTTP sunucuları gibi otomatik olarak bu yanıtı geri gönderir. Tarayıcıların şifre istemi diyalog penceresini nasıl görüntüleyeceğini bilir. –

41

Başlıklara Kimlik Doğrulama/Kimlik Bilgilerinin nasıl ekleneceği sorusuyla karşılaştım. Çözümü şu şekilde buldum. Bana (yapıştırılan Wireshark açıklamaları) isteyen başlıklarını verdi

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; 

,

Yetkilendirme: Temel bXlVc2VyOm15UHdk \ r \ n
Kimlik: MyUser: mypwd

+0

Kullanılacak kodlamanın ASCII olduğundan emin misiniz? –

+1

Güzel nokta. Seçilen kodlama, hatalar için "kaynak bulmak zor" gibi görünüyor. Okuyucuların nasıl karar vereceğiyle ilgili daha fazla bilgi bulabilmeleri için http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication bağlantısını ekledim. – Independent

İlgili konular