1

我正在尝试从 Java 访问 Dynamics NAV 2013 R2 Web 服务。Web 服务正在运行,当我在 Internet Explorer 中输入 URL 时,我可以看到 WSDL,但首先会提示我输入用户名和密码。在 Wireshark 上,我可以看到它使用基于 NTLM 的身份验证。到目前为止,我只能从 Internet Explorer 打开 WSDL,当我在 Firefox 上打开它时,它给了我一个空白页并且没有错误。

我想要做的是使用 wsimport 工具从 Java 访问 Web 服务,但我无法进行身份验证。我已经在其中创建了一个文件夹~/.metro/auth并将以下行放入其中:

http://userfoobar:passforbar@192.168.0.170:7047//DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization

我正在尝试通过以下方式访问网页:

wsimport -d generated -s sources http://@192.168.0.170:7047/DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization

我总是得到错误:

[ERROR] Server returned HTTP response code: 401 for URL: http://@192.168.0.170:7047/DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization,  "http://@192.168.0.170:7047/DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization" needs authorization, please provide authorization file with read access at /home/user/.metro/auth or use -Xauthfile to give the authorization file and on each line provide authorization information using this format : http[s]://user:password@host:port//<url-path>

我在 Linux 和运行 NAV Webservice 的 Windows 7 机器上都试过这个。我是否必须在 NAV 中执行任何其他配置?有什么特别的技巧可以让它发挥作用吗?

4

2 回答 2

3

默认情况下,导航使用 Windows Active Directory 授权。我不确定 wsimport 在 java 中做了什么,但 url 中提供的凭据不太可能起作用。您需要通过协商程序与服务器授权或Nav Server Administration在服务器上的管理单元中更改授权类型(或在配置文件中)。

请参阅此处了解凭证类型,以及如何配置服务器。另请参阅 Freddy 博客中有关如何从 Java 连接到 Nav的有用帖子(我相信它仍然适用,尽管它适用于 Nav 2009)。

soapUI可以处理 NTLM 授权类型,因此您可以在其日志中通过协商过程查看所有请求和响应。

于 2014-02-22T08:41:24.650 回答
0

您可以使用NTLM authenticationBasic authentication访问NAVWeb 服务。您可以使用Postman,curl或任何流行的编程语言。

NTLM authentication当 NAV 使用凭证Windows类型时使用。用户名和密码属于Windows在 NAV 中添加的用户。用户必须enabled在 NAV 中。用户名和密码必须在windows机器上有效,即有人可以使用它们登录电脑。确保选中Use NTLM Authentication复选框NAV Administration。Postman 具有对 NTLM 身份验证的 beta 支持。

Basic authentication当 NAV 使用凭证NavUserPassword类型时使用。用户必须存在于 NAV 中并具有用户名和密码。为了在发出请求时提供字段,Base64 对用户名和密码组合进行编码,即 base64 编码为:用户名:密码。例如,如果我的用户名是 jack,密码是 Jack@1234,那么我将使用的 base64 编码字符串是:amFjazpKYWNrQDEyMzQK。我已经使用以下 bash 命令获得了它:

echo 'jack:Jack@1234' | base64

使用基本身份验证的普通协议在 http 请求中提供身份验证。请参阅:https ://learning.postman.com/docs/sending-requests/authorization/

下面是使用 node.js 中的 httpntlm 库进行 NTLM 身份验证的指南。您可以使用的另一个库是 axios-nltm。

对于 PHP 开发人员,请参阅这篇关于 php ntlm 身份验证的文章。

NTLM authentication允许客户端通过提供服务器上存在的 Windows 帐户的凭据来访问服务器上的资源。

因此,如果服务器有一个名为GilbertSpassword的用户Gilbert1000,您可以通过运行以下 javascript 代码向服务器发送请求:

const httpntlm = require('httpntlm');

const NAV_DimQuery = "http://junit:7148/BC140/ODataV4/Company('CronusCompany')/MyDimensionQuery";
httpntlm.get({
    url: NAV_DimQuery,
    username: 'GilbertS',
    password: 'Gilbert100',
    domain: 'JUNIT'
}, function(err, res) {
    if(err) {
        throw err;
    } 
    console.log(res);
});

通过输入命令安装必要的库:npm i httpntlm 请注意,PHP 和 Java 等其他语言也有类似的库。

要获取域名,请从服务器的命令提示符或终端运行:SET 查找名为USERDOMAIN. 请注意,如果服务器是 PC 而不是专用的 Windows Server,则域可以留空。

资产净值/业务中心特定配置

在 NAV 或 Business Central Administration 中,General 选项卡中有一个字段,称为Use NTLM Authentication确保已选中(设置为 true)。如果您无法从 NAV / BC 管理窗口修改它,请编辑CustomSettings.config路径中的文件:C:\Program Files\Microsoft Dynamics 365 Business Central\140\Service.

因为我们使用 NTLM 进行身份验证,所以确保 NAV / BC 配置为使用Windows authentication. 您可以通过将 设置为Credential Type来做到这一点Windows

如果Credential Type设置为其他值或者您没有勾选Use NTLM Authentication,则在发送请求时会收到错误消息,例如服务器不允许 NTLM。

此外,请确保您用于访问 NAV / BC 中的数据的 Windows 用户存在于 NAV / BC 的用户表中,并且该用户已启用。

如果 NAV 服务器使用 NavUserPassword 身份验证,您可以为同一数据库创建另一个使用 Windows 身份验证的服务器实例。

最后,请注意运行代码会使 NAV 服务器停止的特定情况,我仍在尝试找出导致这种情况的原因。

您可以在评论中进行查询,以防仍有问题导致您的请求失败。

我创建了两个 npm 库来帮助 NAV / BC Web 服务集成。

一个库,它使创建 URL 以发送到 Web 服务以使用 Odata 简单且声明性: https ://www.npmjs.com/package/navodata

构建在httpntlm库之上的客户端,用于使用 Windows 身份验证访问 Web 服务。提供错误处理和使用承诺: https ://www.npmjs.com/package/navclient

于 2021-08-17T19:59:19.737 回答