当前位置: 首页 > 知识库问答 >
问题:

开始对每个请求进行C#WebClient NTLM身份验证

吴升
2023-03-14

考虑一个简单的C#NET Framework 4.0应用程序,该应用程序:

  • 使用WebClient
  • 使用NTLM进行身份验证(在IIS 6.0和IIS 7.5服务器上测试)
  • 使用DownloadString()
  • 多次从URL检索字符串

这里有一个很好的示例:

using System;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string URL_status = "http://localhost/status";

            CredentialCache myCache = new CredentialCache();
            myCache.Add(new Uri(URL_status), "NTLM", new NetworkCredential("username", "password", "domain"));

            WebClient WebClient = new WebClient();
            WebClient.Credentials = myCache;

            for (int i = 1; i <= 5; i++)
            {
                string Result = WebClient.DownloadString(new Uri(URL_status));
                Console.WriteLine("Try " + i.ToString() + ": " + Result);
            }

            Console.Write("Done");
            Console.ReadKey();
        }
    }
}

共有1个答案

公冶嘉茂
2023-03-14

经过10天的尝试,我能想到的一切,并在这个过程中学到了很多,我终于找到了解决这个问题的方法。

诀窍是启用UnsafeAuthenticatedConnectionSharing,方法是重写GetWebRequest,并在返回httpWebRequest中将属性设置为True

您可能希望将其与ConnectionGroupName属性结合使用,以避免未经身份验证的应用程序可能使用该连接。

using System;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string URL_status = "http://localhost/status";

            CredentialCache myCache = new CredentialCache();
            myCache.Add(new Uri(URL_status), "NTLM", new NetworkCredential("username", "password", "domain"));

            MyWebClient webClient = new MyWebClient();
            webClient.Credentials = myCache;

            for (int i = 1; i <= 5; i++)
            {
                string result = webClient.DownloadString(new Uri(URL_status));
                Console.WriteLine("Try {0}: {1}", i, result);
            }

            Console.Write("Done");
            Console.ReadKey();
        }
    }

    public class MyWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);

            if (request is HttpWebRequest) 
            {
                var myWebRequest = request as HttpWebRequest;
                myWebRequest.UnsafeAuthenticatedConnectionSharing = true;
                myWebRequest.KeepAlive = true;
            }

            return request;
        }
    }   
}
 类似资料:
  • 我已经在Spring启动中启用了超文本传输协议基本身份验证。从邮递员打来电话时,我看到了奇怪的结果 自定义用户详情 对于我第一次执行请求,它期望正确的凭据。在我输入正确的凭据后,我得到了结果。但是当我在没有凭据或不同密码的情况下尝试相同的请求时,我不会得到401错误。 只有当我更改用户名时,才会出现401错误。 我的API需要针对每个请求进行验证。 我是不是做错了什么。

  • 我们有一个正在工作的应用程序,我们经历了go-live过程,所有的东西都在live运行好几天。然后我们开始出现SSL错误,我们看到DocuSign包的nuget包有一个更新(我相信这都是针对2019/13/20192019证书自动更新的),所以我们更新了代码,但现在每个请求都为每个令牌验证的请求返回USER_LACKS_MEMBERSHIP错误。 我可以确认的不是问题所在: 我们已经通过accou

  • 我有一个RESTful API,我试图通过Android和RESTTemplate连接。通过设置HttpEntity的头,然后使用RestTemplate的方法,对所有对API的请求进行HTTP身份验证。 所有的GET请求都可以通过这种方式工作,但是我不知道如何完成经过身份验证的POST请求。和处理帖子,但是没有简单的方法来设置身份验证头。 因此,对于GETs,这非常有效: 但是post显然不能与

  • 我用一个android APP(恩智浦提供的NFC标签信息)读取了我的MIFARE Ultraglith C标签,它显示标签上有恩智浦的默认密钥“BREAKMEIFYOUCAN!”第0x2C至0x2F页。但我仍然无法使用此密钥验证此标签。 具体来说,我得到了以下结果: 第一个认证命令:1A00 第一个认证命令的响应:AFCCF489BFB7B98605 ek(RndB):CCF489BFB7B98

  • 我试图得到一个API查询到python。命令行 给出一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python中调用它,这样我就可以循环使用不同的ID并分析输出。有什么想法吗?在需要身份验证之前,我已经使用urllib2完成了这项工作。我还查看了requests模块,但不知道如何实现。 非常感谢。

  • 但是这个配置的问题是我只能以用户Euclid的身份登录。但我想作为每一个可用的用户登录。 但是对于另一个配置,我会在日志中得到这样的消息,即找到了该用户,但已经发生了驱逐。 2017-04-20 09:36:16]ldap_driver.debug:ldap_search(dc=example,dc=com,(&(&(objectclass=person))(UID=einstein)),[arr