2011-02-04 80 views
8

我試圖執行自定義基本身份驗證similar to this並且讓我困惑的一件事是領域的概念。例如,有一個時刻,當我的模塊插入一些神奇的串入回覆:什麼是IIS身份驗證中的「領域」,它與SSL證書參數有什麼關係?

void ReplyWithAuthHeader() 
{ 
    HttpContext currentContext = HttpContext.Current; 
    context.Response.StatusCode = 401; 
    context.Response.AddHeader("WWW-Authenticate", 
     String.Format("Basic realm=\"{0}\"", "myname.mycompany.com")); 
} 

該網站被分配makecert實用程序創建的SSL certicicate,並「發出」到「myname.mycompany.com」。呼叫者創建請求:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serverUrl); 
CredentialCache cache = new CredentialCache(); 
cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("UserName", "password")); 
request.Credentials = cache; 

其中serverUrl開始於https://並且當所述請求是由服務器發送了「WWW驗證」答覆服務器處理,然後一個異常被在客戶端側拋出用「無法將數據寫入傳輸連接:建立的連接被主機中的軟件中止。「文本。

很顯然,SSL協商級別出了問題,我不能說它是什麼。我想這可能是處理這個領域的問題。

我的問題是 - 什麼是領域它是如何與通過SSL進行連接時發出SSL證書的一方的名稱相關的?

回答

10

RFC 2617回答你的問題,一些copypasta「什麼是江湖?」:

境界指令(不區分大小寫)是必需的發出挑戰的所有身份驗證方案。領域值(區分大小寫)結合正在訪問的服務器的規範根URL(其abs_path爲空的服務器的absoluteURI;請參見[2]的第5.1.2節)定義了保護空間。這些領域允許將服務器上的受保護資源劃分爲一組保護空間,每個保護空間都有自己的認證方案和/或授權數據庫。領域值是一個字符串,通常由原始服務器分配,該字符串可能具有特定於身份驗證方案的其他語義。請注意,同一認證方案可能存在多個挑戰,但是不同的領域存在多個挑戰。

至於你的問題它是如何與你的SSL證書相關的:它不是。通過訪問瀏覽器中的URL,我可以想出最簡單的方法來弄清楚發生了什麼問題。您應該清楚地描述問題(主機名與證書不匹配,不受信任的CA,過期等)。

5

該領域指示客戶端進行身份驗證的範圍。瀏覽器會緩存用戶名,密碼和領域,並重新發送任何需要對該領域進行身份驗證的服務器響應的憑證。

SSL與HTTP之間沒有關係,如果您已經設法協商連接併發送請求並獲得響應,則SSL不會是您的問題。您可以嘗試寫入已關閉的連接。在這種情況下,我會將私鑰加載到Wireshark中,並仔細查看協議級別發生了什麼,包括TCP/IP和HTTP。