[英]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
設置的憑據只能通過Basic , Digest或NTLM通過HTTP的Authorization
標頭傳遞。 因此,如果您的Web服務受到WS-Security
保護,則由於WS-Security
不在HTTP級別運行,因此NetworkCredentials
可能根本不會傳遞給身份驗證方案。
您應該做的是通過命令行工具wsdl.exe
或類似工具為Web服務創建Web Service客戶端代理。 這將使您可以訪問支持Web Service的身份驗證方案。
評論后更新:
似乎HttpWebRequest
必須先收到帶有401 Unauthorized
的WWW-Authenticate
質詢,然后才能通過SSL進行正確的身份驗證。 我猜想HttpWebRequests
有兩個單獨的代碼路徑來處理常規HTTP流量和加密的HTTPS流量。 無論如何,您應該嘗試的是:
https://.../
URI執行未經身份驗證的HttpWebRequest
。 401 Unauthorized
回復。 Credentials
(不確定PreAuthenticate
是true
還是false
;請同時測試兩者)。 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.