【问题标题】:Forcing Basic Authentication in WebRequest在 WebRequest 中强制进行基本身份验证
【发布时间】:2011-02-15 09:55:51
【问题描述】:

我正在集成将使用 HTTP-POST 请求和检索数据。远程服务器 需要根据 RFC 2617 进行基本身份验证

我的身份验证尝试失败。

它失败了,即使我将“NetworkCredential”对象附加到“HttpWebRequest”对象的“Credentials”属性,也不会在标头中发送身份验证信息, 即使我设置 'PreAuthenticate' = true。

我错过了什么?

//使用的块

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

Uri uri = new Uri("http://address of services");

ICredentials credentials = netCredential.GetCredential(uri, "Basic");

objRegistration.Credentials = credentials;

objRegistration.PreAuthenticate = true;

【问题讨论】:

标签: .net web-services authentication webrequest


【解决方案1】:

我刚刚发现这个非常方便的小chunk of code 可以完全满足您的需求。它手动将授权标头添加到代码中,而无需等待服务器的质询。

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}

这样使用

var request = WebRequest.Create("http://myserver.com/service");
SetBasicAuthHeader(request, userName, password);

var response = request.GetResponse();

【讨论】:

  • 似乎有更好的方法,但无论如何我都会投赞成票;)
  • 这是正确答案,我不知道Himanshu在说什么。
  • 我认为这是因为 .Net 客户端通常会等待服务器对其凭据进行质询,然后再发送它们。但是有些服务器从不发送挑战,因此使请求成功的唯一方法是手动包含标头。
  • +1 来自 MSDN:WebRequest.PreAuthenticate除了第一次请求 PreAuthenticate 属性表示是否用 发送认证信息后续请求而无需等待服务器质询,并且HttpWebRequest.PreAuthenticate之后 成功验证了对特定Uri的客户端请求,如果PreAuthenticate是真的……
  • 很高兴您复制了代码,因为原始链接现在是 404。
【解决方案2】:

对 samuel-jack 接受的答案进行了一些改进。而不是使用默认编码“ISO-8859-1”应该使用这个答案What encoding should I use for HTTP Basic Authentication?

中提到的

所以代码应该是这样的:

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}

【讨论】:

    【解决方案3】:

    我在寻找答案时发现了这个问题,给出的答案有效但不灵活,所以如果您想要更好的 .NET 方式来做到这一点。

    Uri uri = new Uri("http://address of services");
    
    HttpWebRequest objRegistration = (HttpWebRequest)WebRequest.Create(url);
    
    CredentialCache credentials = new CredentialCache(); 
    
    NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");
    
    credentials.Add(uri, "Basic", netCredential);
    
    objRegistration.Credentials = credentials;
    

    您可以将“Basic”替换为“Digest”、“NTLM”或“Negotiate”,这样还可以将多种类型添加到缓存中。

    【讨论】:

    • 我不会说这种方法更灵活,或者是更好的 .Net 方式。在 CredentialCache 中设置身份验证类型和凭据似乎不会直接影响/设置“授权”标头。在上述情况下设置 CredentialCache 将无济于事(当没有来自服务器的质询/401 状态代码时。)。
    【解决方案4】:

    这是我的 OAuth 解决方案。该值在变量 json 中。

    var myUri = new Uri(fullpath);
    var myWebRequest = WebRequest.Create(myUri);
    var myHttpWebRequest = (HttpWebRequest)myWebRequest;
    myHttpWebRequest.PreAuthenticate = true;
    myHttpWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken);
    myHttpWebRequest.Accept = "application/json";
    
    var myWebResponse = myWebRequest.GetResponse();
    var responseStream = myWebResponse.GetResponseStream();
    if (responseStream == null) return null;
    
    var myStreamReader = new StreamReader(responseStream, Encoding.Default);
    var json = myStreamReader.ReadToEnd();
    
    responseStream.Close();
    myWebResponse.Close();
    

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2013-07-27
      • 1970-01-01
      • 2015-08-12
      • 2017-09-18
      • 2017-06-13
      • 2013-05-30
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多