【问题标题】:HttpWebRequest get unauthorized exceptionHttpWebRequest 获得未经授权的异常
【发布时间】:2020-05-30 10:15:46
【问题描述】:

尝试使用以下代码调用远程服务器,我总是从服务器获得未经授权的异常:

HttpWebRequest webRequest;
var myURI = "https://myURI";
webRequest = (HttpWebRequest)WebRequest.Create(myURI);

webRequest.Method = "GET";

string myCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("myUsername" + ":" + "myPassword"));
webRequest.Headers.Add("Authorization", "Basic " + myCredentials);

HttpWebResponse webResponse;
webResponse = (HttpWebResponse)webRequest.GetResponse();

string response = string.Empty;

using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
{
    response = sr.ReadToEnd();
    sr.Close();
}

System.Net.WebException: '远程服务器返回错误:(401) Unauthorized.'

WWW-Authenticate: Basic realm="geoserver"

缓存控制:代理重新验证

连接:保持活动状态

设置-Cookie:BCSI-CS-**********=1;路径=/

代理支持:基于会话的身份验证

内容类型:文本/纯文本; charset=UTF-8

内容长度:23

这有点奇怪,因为如果我(几乎)通过邮递员尝试相同的事情,它可以工作并且我从远程服务器获得正确的响应(没有 401)。

我也尝试了其他方法,例如以下代码,但没有任何帮助:

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

如果我尝试使用相同的代码调用其他服务器,它可以工作。

【问题讨论】:

  • 使用像wireshark或fiddler这样的嗅探器,比较来自Postman的第一个请求和c#中的第一个请求。使请求中的 c# 标头看起来像邮递员。 c# 中的默认标头与 Postman 不同。

标签: c# .net proxy httpwebrequest


【解决方案1】:

正如您在异常中看到的,具有基于会话的身份验证。问题是:没有关于反向代理的文档,我找不到端点来获取干净的 cookie。作为解决方法,我尝试了以下代码,现在可以使用了。 这可能不是将 Cookie 设置为 HttpHeader 的最佳方式。

    static void Main(string[] args)
    {
        HttpWebRequest webRequest = CreateWebRequest();
        string cookie = null;

        HttpWebResponse webResponse;
        try
        {
            webResponse = (HttpWebResponse) webRequest.GetResponse();
        }
        catch (WebException ex)
        {
            var headers = (WebHeaderCollection)ex.Response.GetType().GetProperty("Headers").GetValue(ex.Response, null);
            cookie = headers.Get("Set-Cookie");
            webRequest = CreateWebRequest();
            webRequest.Headers.Add("Cookie", cookie);
            webResponse = (HttpWebResponse) webRequest.GetResponse();
        }


        string response = string.Empty;

        using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
        {
            response = sr.ReadToEnd();
            sr.Close();
        }
    }

    private static HttpWebRequest CreateWebRequest()
    {
        HttpWebRequest webRequest;
        var myURI = "https://myURI";
        webRequest = (HttpWebRequest)WebRequest.Create(myURI);
        webRequest.Method = "GET";
        string myCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("myUsername" + ":" + "myPassword"));
        webRequest.Headers.Add("Authorization", "Basic " + myCredentials);
        return webRequest;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2012-12-20
    • 2019-03-11
    • 2012-02-22
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多