【发布时间】:2011-10-13 10:41:52
【问题描述】:
我的网络上运行着一个 SharePoint 服务器,我正在尝试在 Delphi 中构建一个应用程序,它允许我访问托管在那里的各种 SharePoint Web Services。
在与 SharePoint 服务器相同的网络上运行我的应用程序可以正常工作,但是,当我尝试在不属于同一域的 VM 上运行它时,我无法通过身份验证。我正在寻找一些关于我应该如何处理这种情况的身份验证的建议,更具体地说,我应该提示用户输入他们的凭据还是有一些内置的安全模型可以用于此?
理想情况下,我想尽量避免在我的应用程序中处理用户名和密码,让操作系统来处理这类事情,但是,目前我似乎看不到任何其他解决方法。
【问题讨论】:
-
首先,您需要知道 SharePoint 支持哪些身份验证方法(例如 Basic、Digest、NTLM、Kerberos)以及目前哪种身份验证方法处于活动状态。 NTLM 不需要用户交互,但其他域需要是“受信任的”iirc。基本身份验证要求应用程序发送用户名/密码,因此如果密码未在某处硬编码,则需要用户交互。
-
@mjn 据我了解,当我尝试访问 Web 服务时,我得到一个 401,服务器应该响应一个 WWW-Authenticate 标头,指示它支持哪种类型的身份验证。那么在这一点上我需要拦截它并提示用户输入凭据吗?这里的目标是允许用户从任何 SharePoint 服务器打开文件,无论他们在哪里运行我的应用程序,因此,可能存在域不受“信任”并且需要模拟的情况。
-
基本上这是正确的,但要提供凭据,可能需要大量代码和客户端/服务器交互步骤,这使用现有代码更容易解决。 Internet Direct (Indy) 支持 NTLM,因此它会在发送 HTTP POST 时在后台处理凭据。只需将必要的身份验证处理程序单元添加到项目中(Indy 自动注册它们)并使用调试器来查看它的工作情况。
-
@mjn 我目前正在使用 Indy,并且我添加了
IdAuthenticationNTLM单元,如果我连接到网络,它确实可以处理所有 NTLM 内容。但是,就像我说的,当我不在网络上时,我只会得到 401,因为我的凭据是错误的。我很想重新使用现有代码来处理这个问题(例如提示用户输入凭据并通过网络发送),但问题是我不知道该怎么做。我将尝试包含IdAuthenticationDigest和IdAuthenticationSSPI单元,看看它是否会自动检测到并提示。 -
您需要验证服务器是否配置为接受这些身份验证类型。
标签: web-services delphi sharepoint authentication delphi-2010