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

问题描述 投票:2回答:2

我们有一个第三方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个凭证时,这会带来一些挑战。

有没有办法清除进程中的凭据缓存?如果那是正在发生的事情。看到这个链接How to stop credential caching on Windows.Web.Http.HttpClient?

我探索过的选项和原型

  • 自托管WCF访问Web服务。为每个凭据启动和停止WCF服务的另一个进程
  • Windows服务中托管的WCF服务 - 为每个凭据启动和停止Windows服务的另一个过程
  • 服务器端凭据等待超过10分钟即可到期。不太可行太慢了。

我上面的问题是它们必须是顺序的,所以要循环1000次它们需要一段时间。每个凭证大约需要20-30秒。

c# asp.net web-services wcf authentication
2个回答
0
投票

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

这将从缓存中删除它。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.