在WebRequest中强制执行基本身份验证

Him*_*shu 50 .net authentication web-services webrequest

我正在集成将使用HTTP-POST来请求和检索数据的Web服务.远程服务器需要根据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;
Run Code Online (Sandbox Code Playgroud)

Sam*_*ack 112

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

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;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它

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

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

  • 我认为这是因为.Net客户端通常会在发送之前等待服务器挑战它的凭据.但是有些服务器从不发送挑战,因此获得成功请求的唯一方法是手动包含标头. (9认同)

小智 7

改善samuel-jack接受的答案.应该使用本答案中提到的默认编码"ISO-8859-1"而不是使用什么编码来进行HTTP基本身份验证?

所以代码看起来像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我在寻找答案时发现了这个问题,给出的答案有效但不灵活,所以如果您想要更好的 .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;
Run Code Online (Sandbox Code Playgroud)

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