使用当前登录用户csom创建SharePoint的项目

时间:2018-09-07 15:13:00

标签: web-services sharepoint csom

我有一个Web服务,其中身份验证机制设置为Windows(NTLM)身份验证。通过此Web服务,我正在SharePoint列表中创建/更新项目。我想使用当前登录用户创建/更新项目。下面是我的代码块。

public string InsertItem(string title)
    {
        try
        {
            Uri uri = new Uri("http://tempuri.org/");
            ICredentials credentials = CredentialCache.DefaultNetworkCredentials;
            NetworkCredential credential = credentials.GetCredential(uri, "NTLM");
            string siteUrl = "http://spdev:91";
            ClientContext clientContext = new ClientContext(siteUrl);
            clientContext.Credentials = credential;
            Web web = clientContext.Web;
            clientContext.Load(web);
            List testlist = clientContext.Web.Lists.GetByTitle("Test");
            ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();
            ListItem newItem = testlist.AddItem(itemCreateInfo);
            newItem["Title"] = title;
            newItem.Update();
            clientContext.ExecuteQuery();  
            return "";
        }
        catch (Exception ex)
        {
            return ex.Message;
        }        
    }

但是每次都是由应用程序池用户而不是登录用户创建的。有没有一种方法可以用当前登录用户的代码在列表中创建项目?感谢这方面的任何建议。

1 个答案:

答案 0 :(得分:0)

DefaultNetworkCredentials意味着Web服务将在当前的安全上下文(即应用程序池)下运行。也无法传递用户凭据。

如果您的App Pool帐户具有足够的特权(完全控制列表/站点),则可以使用CSOM设置“创建”,“创建者”,“修改者”和“修改者”字段。调用Web服务时可以传递当前的用户详细信息(登录名)

        ClientContext ctx = new ClientContext("http://site");
        List list = ctx.Web.Lists.GetByTitle("List");
        ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery());
        ctx.Load(items);
        ctx.ExecuteQuery();
        User currentUser= ctx.Web.EnsureUser("domain\\user");
        ctx.Load(currentUser);
        ctx.ExecuteQuery();
        foreach (var item in items)
        {
            item["Created"] = "date";
            item["Modified"] = "date";
            item["Editor"] = currentUser;
            item["Author"] = currentUser;
            item.Update();
        }
        ctx.ExecuteQuery();