2011-11-09 19 views
8

çalışmıyor .NET HttpWebRequest URI aracılığıyla kullanıcı adı ve şifresini Geçme:Aşağıdaki kodu Running

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
var response = request.GetResponse(); 

... ve hiçbir yetki müvekkilimin girişimde bulunmaktadır oranlarına baktığımızda Wireshark'ı kullanarak isteği teftiş (url'dir her zaman 401 dönecek basit bir servis).

Bu kod ilk mücadeleden sonra bir yetkilendirme başlığı gönderir:

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
request.Credentials = new NetworkCredential("username", "password"); 
var response = request.GetResponse(); 

System.Uri sınıf etkisi yoktur kullanma. URL'de kullanıcı adı ve şifre neden kimlik doğrulaması için kullanılmıyor?

(Ben ilk meydan vermeden yetkilendirme başlığını geçirmek üzerine this blog post farkında değilim, ama şu eline sorun değildir)

DÜZENLEME Ben sınırlamasını aşmak için oldukça kolay olduğunu eklemek gerekir

var userInfo = request.Address.UserInfo; 
if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(':')) 
{ 
    request.Credentials = new NetworkCredential(userInfo.Split(':').First(), userInfo.Split(':').Last()); 
} 

cevap

3

HttpWebRequest sınıf Uri kimlik bilgilerini kullanmaz: bu kod biraz örneğin (url tatmaya un-kaçan ekleyin), bunu yapmak zorunda neden olarak sadece merak ediyorum (dotPeek başına).

Ama yapar FtpWebRequest, burada ilgili kodudur:

if (this.m_Uri.UserInfo != null && this.m_Uri.UserInfo.Length != 0) 
    { 
    string userInfo = this.m_Uri.UserInfo; 
    string userName = userInfo; 
    string password = ""; 
    int length = userInfo.IndexOf(':'); 
    if (length != -1) 
    { 
     userName = Uri.UnescapeDataString(userInfo.Substring(0, length)); 
     int startIndex = length + 1; 
     password = Uri.UnescapeDataString(userInfo.Substring(startIndex, userInfo.Length - startIndex)); 
    } 
    networkCredential = new NetworkCredential(userName, password); 
    } 

bunu sadece sadece yapmalıyım böylece, kimlik için vermektedir görebileceğiniz gibi yerine elle ayrıştırılır Uri

+0

Evet ile, Bende benzer bir kod var - HttpWebRequest'in bunu neden görmezden geldiğini anlamıyorum ... – friism

+1

Bunun bir güvenlik sorunu olduğunu düşünüyorum. Birçok tarayıcı artık bunu da görmezden geliyor: http://support.microsoft.com/kb/834489 Kullanmak için hiç kodlanmış olup olmadığını görmek için önceki .NET sürümlerine bakmam gerekiyordu, ancak açıkçası 4.0 içinde –

İlgili konular