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

时间:2016-02-05 04:47:02

标签: c# asp.net web-services wcf authentication

我们有一个第三方网络服务,我们从我们的网络应用程序中消费。我已经创建了一个Windows服务,为我们所有的客户调用这个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秒。

2 个答案:

答案 0 :(得分:0)

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

这会将其从缓存中删除。

答案 1 :(得分:0)

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