在使用 Windows 身份验证的 Sharepoint 2010 应用程序中托管了此自定义 WCF REST 服务。
我需要在 .NET 项目(即控制台项目)中使用此服务,但凭证让我发疯。我收到很多回复(取决于我是否包含一些身份验证)400 - bad request
。401 - unauthorized
让我给你举个例子:
siteUri
是 SP 站点(根/主页)methodUri
的 url,是返回 XML 的服务方法的 url。
同样,该站点已通过 Windows 身份验证。如果我打开浏览器并转到methodUri
我得到:
请求错误
服务器在处理请求时遇到错误。有关更多详细信息,请参阅服务器日志。
但是,如果然后我去siteUri
,Sharepoint 主页加载,然后我可以methodUri
再次浏览,现在我得到正确的 XML 响应。
因此,似乎浏览到主页会存储一些 cookie,然后在向 web 方法发出请求时使用这些 cookie。检查 Fiddler 中的请求,我可以确认这一点:
第一个methodUri
请求因代码而失败,400
并且请求标头中没有任何 Cookie。然后,当我浏览主页 ( siteUri
) 时,有一些请求/响应似乎是身份验证本身。响应头包括:
WWW-Authenticate: Negotiate oRswGaADCgEAoxIEEAEAAABDh+CIwTbjqQAAAAA=
Set-Cookie: WSS_KeepSessionAuthenticated={b89d78b2-063d-4ac4-810e-bde4e04a829e}; path=/
Persistent-Auth: true
最后,当methodUri
再次浏览时,第一个响应是 401 - 未经授权,但之后有另一个请求包括此标头
Cookie: WSS_KeepSessionAuthenticated={b89d78b2-063d-4ac4-810e-bde4e04a829e}
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAAD37/i76Dl3jNyK8bIRz57fmjEgQQAQAAAPUXp1AtIpqEAAAAAA==
最终被接受并且服务使用相应的 XML 进行响应。
所以浏览器足够聪明,可以处理这个来回的请求/响应来验证当前的 windows 用户。
我的问题是,如何在 .NET(3.5 或 4)中执行此操作,但不使用默认凭据,我需要指定用户名、密码和域。
我已经花了 5 天的时间来处理这个问题,我可以使用 HttpWebRequest 中的默认网络凭据使其工作,但是当我手动设置凭据时(使用与当前登录用户相同的凭据)它不起作用。
我只是觉得这整个事情过于复杂了(谢谢微软),因为我来自开源(ruby、python)背景,而且这种事情很简单。
希望我很清楚,如果您需要任何额外的信息,请询问。我愿意为此付出我的全部名誉。
谢谢