簡體   English   中英

HttpWebRequest沒有傳遞憑據

[英]HttpWebRequest not passing Credentials

我正在嘗試使用HTTPWebRequest訪問REST服務,並且在傳遞憑據時遇到問題,請參見下面的代碼。 我已經閱讀到NetworkCredential不支持SSL,並且正在訪問HTTPS站點。 有誰知道類似於NetworkCredential的類,該類支持SSL?

Uri requestUri = null;
Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
NetworkCredential nc = new NetworkCredential("user", "password");
request.Credentials = nc;
request.Method = WebRequestMethods.Http.Get;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

查看使用老式方法時是否顯示:

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);

哪種身份驗證機制可以保護Web服務? HttpWebRequest設置的憑據只能通過BasicDigestNTLM通過HTTP的Authorization標頭傳遞。 因此,如果您的Web服務受到WS-Security保護,則由於WS-Security不在HTTP級別運行,因此NetworkCredentials可能根本不會傳遞給身份驗證方案。

您應該做的是通過命令行工具wsdl.exe或類似工具為Web服務創建Web Service客戶端代理。 這將使您可以訪問支持Web Service的身份驗證方案。

評論后更新:

似乎HttpWebRequest必須先收到帶有401 UnauthorizedWWW-Authenticate質詢,然后才能通過SSL進行正確的身份驗證。 我猜想HttpWebRequests有兩個單獨的代碼路徑來處理常規HTTP流量和加密的HTTPS流量。 無論如何,您應該嘗試的是:

  1. https://.../ URI執行未經身份驗證的HttpWebRequest
  2. 收到401 Unauthorized回復。
  3. 現在執行相同的請求,同時設置兩個Credentials (不確定PreAuthenticatetrue還是false ;請同時測試兩者)。
  4. 您現在應該獲得200 OK或您的Web服務響應的內容。

另一個選擇是根據初始請求自己構建Authorization標頭:

string credentials = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(credentials);
string base64 = Convert.ToBase64String(bytes);
string authorization = String.Concat("Basic ", base64);
request.Headers.Add("Authorization", authorization);

如果您的服務器使用NTLM身份驗證,則可以嘗試以下操作:

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password"));
request.Credentials = cc;

嘗試將request.PreAuthenticate設置為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM