【发布时间】:2021-03-19 21:37:55
【问题描述】:
我遇到了一些奇怪的行为(这意味着我不明白发生了什么),如果可能的话,我需要一些帮助来解决它。
我们有一些 Dynamics 365 NAV Business Central Web 服务公开了一个带有 SSL 证书的安全,我们正在使用一些标准 C# 代码访问它。
我们已将 SOAP 代理添加到 ASP .NET Webforms 应用程序,这一切都按预期工作。
然后我们声明一个 Web 服务的实例,使用新的 NetworkCredential 实例设置凭据,并将 Web 服务设置为使用 PreAuthenticate,然后在我们的服务上调用该方法。
public static bool CheckServiceStatus()
{
bool returnValue = false;
try
{
svcWebServiceServer webService = new svcWebServiceServer();
webService.Credentials = new NetworkCredential(Globals.WebServiceUsername, Globals.WebServicePassword, Globals.WebServiceDomain);
webService.PreAuthenticate = true;
webService.FncServiceStatus(ref returnValue);
}
catch (Exception ex)
{
LoggingFunctions.WriteMessageToDisk("CheckServiceStatus error : " + ex.Message);
}
return returnValue;
}
当我们在 Fiddler 中查看日志时,我们发现该服务被调用了两次。第一次调用时,我们收到一个 401 错误响应,告诉我们必须使用 NTLM,然后使用更长的 NTLM 密钥进行第二次调用,调用成功,我们得到了我们的数据...
第一次尝试...
第二次尝试...
谁能告诉我如何进行网络服务调用,以便第一次进行身份验证? 401 被认为是 DDOS 式攻击,然后流量被阻止。
我已尝试更改凭据的传递方式,但这没有任何区别...
public static bool CheckServiceStatus()
{
bool returnValue = false;
try
{
svcWebServiceServer webService = new svcWebServiceServer();
CredentialCache credCache = new CredentialCache();
credCache.Add(new Uri(webService.Url), "NTLM", new NetworkCredential(Globals.WebServiceUsername, Globals.WebServicePassword, Globals.WebServiceDomain));
webService.Credentials = credCache;
webService.PreAuthenticate = true;
webService.FncServiceStatus(ref returnValue);
}
catch (Exception ex)
{
LoggingFunctions.WriteMessageToDisk("CheckServiceStatus error : " + ex.Message);
}
return returnValue;
}
【问题讨论】:
-
当您新建服务时,它会拨打电话吗?第一次调用中的 Content-Length 为 0。您可以新建它并在一行中传递凭据吗?
-
感谢 Wazz,不幸的是这不起作用。使用 PreAuthenticate 时,第一次失败 2 次,然后成功。第一次失败具有正确的内容长度,并返回 401 表示需要 NTLM,第二次尝试(内容长度为 0)使用 NTLM 值,它也返回 401,最后在第三次尝试时,它通过。
-
我想我知道为什么现在会发生这种情况,并会尽快发布答案。
标签: asp.net web-services webforms dynamics-business-central