我有一个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;
}
}
但是每次都是由应用程序池用户而不是登录用户创建的。有没有一种方法可以用当前登录用户的代码在列表中创建项目?感谢这方面的任何建议。
答案 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();