Sharepoint模拟外部Web服务调用

时间:2014-07-31 11:23:05

标签: c# web-services sharepoint impersonation

我创建了一个运行在不同机器/ IIS上的Web服务,而不是我的SharePoint(2013)应用程序节点(双跃点问题开始)。我将此Web服务公开给我们公司的其他服务。

下面的代码段将使用专用凭据成功检索SharePoint列表(即" sp_admin_user")。

在我的网络服务中,我可以检索调用它的用户的用户名(无密码ofc),该用户也按规则存在于SharePoint中。

我的问题:我如何更改以下代码以便使用上述用户名进行模拟?

 [WebMethod]
 [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
 public string get_sp_list()
    {
    SPLists.Lists myservice = new SPLists.Lists();
    myservice.Credentials = new System.Net.NetworkCredential( "sp_admin_user", "password123", "domain" );
    myservice.Url = "https://sharepoint.company.com/sites/testground/_vti_bin/Lists.asmx";
    [.. setting of variables ..]
    System.Xml.XmlNode n = myservice.GetListItems(
        sidList,
        sidView, 
        query, 
        viewFields, 
        rowLimit, 
        queryOptions, 
        null
    );
    [.. compose json ..]
    return json;
 }

1 个答案:

答案 0 :(得分:1)

您可以在没有密码的情况下模拟的唯一用户是SharePoint IIS应用程序池用户(通常是NETWORK SERVICE)。若要模拟正在访问SharePoint页面的用户,运行SharePoint的计算机需要具有对外部服务的委派权限。你可以阅读它here。这完全是关于安全限制的。

我建议你拒绝冒充方法,更容易处理密码,匿名网络服务电话或发明别的东西。

您可以像这样冒充用户:

using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero))
{
    //external web service call as "COMPUTER_NAME\NETWORK_SERVICE" user
}

如果您有密码,也可以获得真实的用户令牌(不是IntPtr.Zero)。