【问题标题】:Access Dynamics NAV Webservice with Java使用 Java 访问 Dynamics NAV Web 服务
【发布时间】:2014-03-23 07:41:39
【问题描述】:

我正在尝试从 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 Web 服务的 Windows 7 机器上都试过这个。我是否必须在 NAV 中执行任何其他配置?有什么特别的技巧可以让它发挥作用吗?

【问题讨论】:

    标签: java microsoft-dynamics dynamics-nav dynamics-nav-2013


    【解决方案1】:

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

    请参阅here 了解凭据类型,here 是如何配置服务器。另请参阅 Freddy 的博客 how to connect to Nav from Java 中的有用帖子(我相信它仍然适用,尽管它适用于 Nav 2009)。

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

    【讨论】:

    • 部分解决方案是激活:使用 NTLM 身份验证指定是否为 Web 服务启用 NTLM 身份验证。要要求 Kerberos 身份验证,请禁用此选项。 我仍然无法使用 wsimport 导入 wsdl,但我现在可以使用 Authenticator 类从 Java 访问 Web 服务。现在我只是将wsdl 文件保存在浏览器中并从文件中导入类。
    • 更新: 似乎在 Windows wsimport 上它能够进行身份验证(如果 NTLM 选项被激活)并加载 wsdl 信息,我什至没有必须提供凭据。但是在 Linux 上它不起作用。
    • @lanoxx:您能否提供有关您的成功案例的示例代码?我对 NodeJS 做同样的事情,但无法访问 NAV SOAP Web 服务。你能帮帮我吗?
    • @Pritam,确保在 NAV 管理控制台中为您要连接的实例启用了NTLM Authentication。然后你需要弄清楚如何从 NodeJS 进行 NTLM 身份验证,我不知道该怎么做。在 Java 上有一个名为 java.net.Authenticator 的类,如果配置正确,则 NTLM 身份验证将自动工作。
    • @lanoxx:感谢您的回复。是的。我为 NAV 实例启用了NTLM Authentication。但我无法通过 Windows 身份验证。是否可以通过甚至通过Windows身份验证?
    【解决方案2】:

    您可以使用NTLM authenticationBasic authentication 访问NAV 网络服务。您可以使用Postmancurl 或任何流行的编程语言。

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

    当 NAV 使用 NavUserPassword 凭证类型时,使用 Basic authentication。用户必须存在于 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 开发人员,请参阅此 article 关于 php ntlm 身份验证。

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

    因此,如果服务器有一个名为 GilbertS 且密码为 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 / 业务中心特定配置

    在 NAV 或 Business Central Administration 中,“常规”选项卡中有一个名为 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 服务器停止的特定情况,我仍在尝试找出导致这种情况的原因。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 2014-07-14
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多