在部署到SharePoint的WCF服务中创建SPListItem

时间:2009-12-02 11:14:44

标签: wcf security sharepoint service

我在使用Shail Malik指南部署到SharePoint的WCF服务中有以下方法:

[OperationContract]
public string AddItem(string itemTitle, Guid? idOfListToUse)
{
  using (var portal = new SPSite(SPContext.Current.Site.Url, SPContext.Current.Site.SystemAccount.UserToken))
  {
    using (var web = portal.OpenWeb())
    {          
      Guid listId;

      web.AllowUnsafeUpdates = true;

      if (idOfListToUse != null && idOfListToUse.Value != new Guid())
      {
        listId = idOfListToUse.Value;
      }
      else
      {
        try
        {
          listId = new Guid(web.Properties[PropertyBagKeys.TagsList]);
        }
        catch (Exception ex)
        {
          throw new MyException("No List Id for the tag list (default list) has been found!", ex);
        }
      }

      var list = web.Lists[listId];

      string title = "";

      SPSecurity.RunWithElevatedPrivileges(delegate{
        var newItem = list.Items.Add();
        newItem["Title"] = itemTitle;
        newItem.Update();
        title = newItem.Title;
      });

      web.AllowUnsafeUpdates = false;

      return title;
    }
  }
}

当从Javascript调用该方法时(使用Rick Strahl的优秀ServiceProxy.js),它会失败并且因为ValidateFormDigest()而在newItem.Update()上执行此操作。

这是踢球者,但是当我逐步完成代码时,它才有效!完全没有例外!

3 个答案:

答案 0 :(得分:1)

好的,找到了答案(甚至还有2个:-D)

首先,脏的:

在上下文中设置FormDigestValidatedProperty:

HttpContext.Current.Items["FormDigestValidated"] = true;

其次,稍微不那么脏的版本(基本上为XSS攻击留下了开路,但无论如何这都是内联网)

The answer

答案 1 :(得分:0)

我认为你不能访问'list',因为它是在提升的代码块之外创建的。

http://blogs.pointbridge.com/Blogs/herzog_daniel/Pages/Post.aspx?_ID=8

我猜你在踩踏时虽然整个过程处于管理模式,但所有都升级了。

答案 2 :(得分:0)

Colin,尝试在WCF服务中访问HttpContext(同样是SPContext)是一个非常糟糕的主意。见这里:MSDN: WCF Services and ASP.NET

来自文章:

  

HttpContext:Current始终为null   从WCF中访问时   服务。

这可能是导致问题的原因。

编辑:我注意到您正在尝试使用SPContext来获取网站集的网址。我没有找到一个好的解决方案,所以我只是将目标网站集的url作为参数发送给服务调用。不是最优的解决方案,但我想不出更好的方法。此外,如果您需要检查身份验证/身份等,请使用ServiceSecurityContext.Current