401 Unauthorized在GET请求(https)上使用正确的凭据返回

Dav*_*vid 5 .net c# authentication ssl httpwebrequest

我试图使用HttpWebRequest登录我的网络应用程序,但我一直收到以下错误:

System.Net.WebException: The remote server returned an error: (401) Unauthorized.
Run Code Online (Sandbox Code Playgroud)

Fiddler有以下输出:

Result Protocol  Host           URL
200    HTTP      CONNECT        mysite.com:443
302    HTTPS     mysite.com     /auth
401    HTTP      mysite.com     /auth
Run Code Online (Sandbox Code Playgroud)

这就是我正在做的事情:

// to ignore SSL certificate errors
public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
     return true;
}
Run Code Online (Sandbox Code Playgroud)
try
{   
    // request
    Uri uri = new Uri("https://mysite.com/auth");
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri) as HttpWebRequest;
    request.Accept = "application/xml";

    // authentication
    string user = "user";
    string pwd = "secret";   
    string auth = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(user + ":" + pwd));
    request.Headers.Add("Authorization", auth);
    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

    // response.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // Display 
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();
    Console.WriteLine(responseFromServer);

    // Cleanup 
    reader.Close();
    dataStream.Close();
    response.Close();
}
catch (WebException webEx)
{
   Console.Write(webEx.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我可以在Mac应用程序中使用ASIHTTPRequest登录到同一站点,没有问题,如下所示:

NSURL *login_url = [NSURL URLWithString:@"https://mysite.com/auth"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:login_url];
[request setDelegate:self];
[request setUsername:name];
[request setPassword:pwd];  
[request setRequestMethod:@"GET"];
[request addRequestHeader:@"Accept" value:@"application/xml"]; 
[request startAsynchronous];    
Run Code Online (Sandbox Code Playgroud)

Pau*_*ter 10

试试这个:

var uri = new Uri("https:/example.com/auth");
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Accept = "application/xml";

// authentication
var cache = new CredentialCache();
cache.Add(uri, "Basic", new NetworkCredential("user", "secret"));
request.Credentials = cache;

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

// response.
var response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

请注意使用NetworkCredential该类而不是滚动自己的身份验证标头.

  • 这就是我最初尝试过的,我仍然得到401.唯一的区别是Fiddler说请求中没有授权头. (2认同)