SPListItem.Update为Forms身份验证的用户抛出UnauthorizedAccessException

时间:2012-10-08 20:44:06

标签: c# asp.net sharepoint-2007 moss2007-security

我正在尝试修复一些将项目插入SharePoint列表的代码(我没写过)。问题是代码适用于匿名用户,但如果用户通过ASP.NET窗体身份验证登录,则在调用SPListItem的Update方法时会收到UnauthorizedAccessException。当它工作时,作为匿名用户,我可以看到SPListItem的SPWeb的SPUser是SharePoint系统帐户。但是,当用户使用Forms身份验证登录时,SPUser为空。有人可以解释这种行为以及如何解决它吗?

最初只有顶级代码块在RunWithElevatedPrivileges委托中,但我尝试将其全部移到内部。一旦我开始工作,我会插入一些使用块:

SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            rootWeb = SPContext.Current.Site.RootWeb;
            rootWeb.AllowUnsafeUpdates = true;
            currentWeb = SPContext.Current.Web;
            currentWeb.AllowUnsafeUpdates = true;

        try
        {
            // Get site information
            SPList franDir = rootWeb.GetList("/Lists/Directory");
            SPQuery query = new SPQuery();
            query.Query = "<Where><Eq><FieldRef Name='Subsite'/><Value Type='Text'>" + currentWeb.Name +
                 "</Value></Eq></Where>";

            SPListItemCollection items = franDir.GetItems(query);

            SPList l = rootWeb.GetList("/Lists/Request");

            SPListItem li = l.Items.Add();
            li["Location"] = siteName;
            //...set more fields


            li.Update();

        }
        catch (Exception ex)
        {
            rootWeb.Dispose();
            logger.ErrorException("An error occured adding item", ex);
            throw ex;
        }

        rootWeb.Dispose();
        });

1 个答案:

答案 0 :(得分:0)

感谢@AlexeiLevenkov我发现这不起作用,因为我使用的是使用默认权限创建的SP对象的现有实例。作为代码不执行任何操作的证据,当作为匿名用户运行时,即使没有RunWithElevatedPrivileges调用,代码也会成功。我做了这个改变,它照顾它。

SPSecurity.RunWithElevatedPrivileges(delegate()
{
     rootWeb = new SPSite(SPContext.Current.Site.ID).RootWeb;

非常感谢!