使用多个凭据通过基本身份验证调用 Web 服务

本文关键字:身份验证 调用 服务 Web | 更新日期: 2023-09-27 18:33:14

我们有一个从我们的 Web 应用程序中使用的第三方 Web 服务。我创建了一个 Windows 服务,该服务为所有客户调用此 Web 服务,每个客户都有自己的凭据。

Web 服务正在使用基本身份验证。

循环访问凭据时,它始终使用第一个经过身份验证的凭据。

示例代码如下:

private void testConnection(string username, string password)
{
    _url = "https://somewebservice.com.au/transport/SomeService";
    using (var someWebService = new someWebService {Url = _url})
    {
        var netCredential = new NetworkCredential(username, password);
        var credential = new CredentialCache
        {
            {new Uri(someWebService.Url), "Basic", new NetworkCredential(username, password)}
        };
        someWebService.Credentials = credential;
        someWebService.PreAuthenticate = true;
        someWebService.Timeout = 1200000;
        try
        {
            var result = someWebService.testConnection();
            textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), result);
        }
        catch (SoapException soapex)
        {
            textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), "SOAP Error: " + soapex.Message + "'r'n");
        }
        catch (WebException webex)
        {
            textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), "Web Error: " + webex.Message + "'r'n");
        }
        catch (Exception ex)
        {
            textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), "Error: " + ex.Message + "'r'n");
        }
        finally
        {
            credential.Remove(new Uri(someWebService.Url), "Basic");
        }
    }
}
private void buttonTest2_Click(object sender, EventArgs e)
{
    ThreadStart start = () => testConnection("user1", "123");
    new Thread(start).Start();
}
private void buttonTest3_Click(object sender, EventArgs e)
{
    ThreadStart start = () => testConnection("user2", "1234");
    new Thread(start).Start();
}

如果首先对"user1"进行身份验证,则对testConnection的第二次调用将始终使用"user1"凭据。

我尝试将HttpWebRequest KeepAlive设置为false,这样连接就不会被重复使用。TCP 监控显示连接在设置为 false 后被终止。这并没有解决问题。

如果我关闭应用程序并重新启动,并为"user2"运行 testConnection,它会给出正确的结果。

似乎凭据已缓存在进程中。摆脱它的唯一方法是退出该过程。

当我必须循环浏览大约 1000 个凭据时,这会带来一些挑战。

有没有办法清除正在进行的凭据缓存?如果这就是正在发生的事情。请参阅此链接 如何在 Windows.Web.Http.HttpClient 上停止凭据缓存?

我探索和原型化的选项

  • 访问 Web 服务的自承载 WCF。为每个凭据启动和停止 WCF 服务的另一个进程
  • Windows 服务
  • 中承载的 WCF 服务 - 为每个凭据启动和停止 Windows 服务的另一个进程
  • 等待 10 分钟以上,服务器端凭据过期。不能活得太慢。

我对上述内容的问题是它们必须是连续的,因此循环浏览其中的 1000 个需要一段时间。每个凭据大约为 20-30 秒。

使用多个凭据通过基本身份验证调用 Web 服务

在最后一个捕获块之后尝试使用 CredentialCache.Remove(( 方法。https://msdn.microsoft.com/en-US/library/4zaz5c95(v=vs.110(.aspx

这将从缓存中删除它。

也许这是一个有点老的问题,但你应该PreAuthenticate HttpClient 不缓存凭据false