Web services 如何从FBA网站上的Silverlight调用SharePoint 2007 web服务

Web services 如何从FBA网站上的Silverlight调用SharePoint 2007 web服务,web-services,cookies,sharepoint-2007,silverlight-5.0,moss,Web Services,Cookies,Sharepoint 2007,Silverlight 5.0,Moss,我有一个在SharePoint 2007网站上运行的Silverlight 5应用程序。Silverlight应用程序使用lists.asmx服务从SharePoint列表中获取大量数据。主站点使用NTLM安全性进行保护,Silverlight能够成功调用web服务,而无需对身份验证进行任何设置。我们将SharePoint站点扩展到使用asp.net FormsBasedAuthentication的第二个域。在此版本的站点上,第一个web服务调用失败,出现403禁止响应和异常: System.

我有一个在SharePoint 2007网站上运行的Silverlight 5应用程序。Silverlight应用程序使用lists.asmx服务从SharePoint列表中获取大量数据。主站点使用NTLM安全性进行保护,Silverlight能够成功调用web服务,而无需对身份验证进行任何设置。我们将SharePoint站点扩展到使用asp.net FormsBasedAuthentication的第二个域。在此版本的站点上,第一个web服务调用失败,出现403禁止响应和异常:

System.ServiceModel.CommunicationException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
据我所知,这是一个通用消息,而不是真正的例外。很明显,我们需要真正的例外来了解问题所在。(在Silverlight中创建和处理故障)提供了两种获取真正异常的解决方案

第一个是修改WCF服务以返回备用HTTP状态代码。这不起作用,因为它不是一个WCF服务,而是一个.asmx web服务,所以我不能添加建议的WCF行为来修改状态代码。第二,它是SharePoint的服务,所以无论如何我都不能做太多修改。我是否可以修改IIS以获得等效的解决方案

第二种解决方案是在Silverlight应用程序中注册替代HTTP堆栈。我尝试了一下,发现“真正”的异常是身份验证异常。因此,我陷入了死胡同,试图在大约24小时内获得身份验证,但最终发现,通常情况下,ASP.NET身份验证cookie随服务请求一起传递,除非您使用的是客户端HTTP堆栈。因此,注册客户端HTTP堆栈允许我看到真正的异常,但它创建了自己的异常,似乎只有不使用客户端HTTP堆栈才能修复该异常


我相信您已经使用Fiddler验证了身份验证cookie是在使用默认HTTP堆栈时发送的。我不知道Lists.asmx服务是否无法使用它,是否仍在发出身份验证错误,或者是否存在其他异常。如何确定“远程服务器返回错误:NotFound.”异常的原因?

好吧,对于“如何确定原因…”的问题,这不是一个很好的答案,但这对我来说是有效的。我所做的是在reflector中打开STSSOAP.dll,它是包含列表服务实现的程序集。我复制了相关代码以在我自己的服务中实现我自己的GetListItems方法。幸运的是,实际的Lists.GetListItems方法代码很小,只调用了其他SharePoint方法,更幸运的是,这些方法和成员都声明为公共的,所以我能够做到这一点。然后,我在服务器上用我的版本替换了Lists.asmx,并附加了调试器以获取一些信息。我发现我的身份验证cookie正在使用,HttpContext.Current.Session.User.Identity.IsAuthenticated为true。所以它知道我登录了。但我仍然得到了一个身份验证错误,我可以在SharePoint代码的更深处看到这个错误,它被转换为403

所以我知道asp.net认为我经过身份验证,但SharePoint说我没有权限。但是应用程序池运行所使用的服务帐户是SP管理员,所以为什么我没有权限?接下来我检查了SPContext.Current.Web.User;SharePoint的当前用户。它是空的!换句话说,就SharePoint而言,我仍然以匿名用户身份登录,因为我没有与域用户明确登录,并且匿名用户对我正在访问的列表或API的大部分其他部分没有权限。肖恩·麦克唐纳的答案将其展现出来

基本上,我需要以提升的权限运行所涉及的代码,以使代码在我最初认为它正在运行的asp.net服务帐户下运行。如果使用API,则可以使用RunWithElevatedPrivileges委托。但是,如果您正在调用web服务,则不能这样做。我能想到的几个选择是:

  • 调用使用Windows身份验证的基本站点上的服务。这需要我在客户端Silverlight应用程序中嵌入凭据,这是一种安全威胁,因此我拒绝了这一点
  • 实现我自己的web服务来为我获取数据。
    • web服务可以使用SharePoint API和访问列表 以提升的权限运行
    • web服务可以通过传递当前凭据或其他嵌入凭据来调用Windows身份验证站点的服务
  • 为了便于实现,到目前为止,我所做的只是第2项下的第二个选项,它正在工作。但是,它很笨重,我可能会改为选项1,我希望它也能起作用。

    本文: