从ASP.Net页面在C#中将NetworkCredential传递给HttpWebRequest

时间:2009-11-05 20:33:45

标签: asp.net http httpwebrequest

我正在尝试使用HTTPWebRequest来访问Web服务,并且在传递凭据时遇到问题,请参阅下面的代码。我可以看到在调试器中构建的凭证对象nc,以及request.Credentials的赋值,但是当我到达最后一行代码时,它会出现未经授权的错误消息。我让我们的服务器人员在服务器上查看请求,并且没有传递凭据。我在Credentials对象上做错了什么,或者我需要做些什么我不在这里做什么?

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(); 

3 个答案:

答案 0 :(得分:13)

NetworkCredentials非常不直观,或者说是片状,或两者兼而有之。无论如何,您可以通过完全绕过NetworkCredentials并使用此方法解决问题(我发现,由mark.michaelis.net提供)

/* http://mark.michaelis.net/Blog/CallingWebServicesUsingBasicAuthentication.aspx */
byte[] credentialBuffer = new UTF8Encoding().GetBytes(username + ":" +password);
req.Headers["Authorization"] ="Basic " + Convert.ToBase64String(credentialBuffer);

所以你正在做的是手动为你的HttpWebRequest创建一个标题,并插入基本身份验证标题中显示的内容。像魅力一样。

答案 1 :(得分:2)

Microsoft Premier Support最终帮助我通过使用CredentialCache类添加凭据和“基本”授权来解决此问题:

NetworkCredential nc =
    new NetworkCredential(GetSetting("username"), GetSetting("password"));
CredentialCache cache = new CredentialCache();

cache.Add(requestUri, "Basic", nc);

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);

答案 2 :(得分:1)

它帮助了我(对于Unity3d mono,不是ASP.Net):

request.PreAuthenticate = true;

不需要手动设置Authorization标头或使用CredentialCache。