我正在尝试修复一些将项目插入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();
});
答案 0 :(得分:0)
感谢@AlexeiLevenkov我发现这不起作用,因为我使用的是使用默认权限创建的SP对象的现有实例。作为代码不执行任何操作的证据,当作为匿名用户运行时,即使没有RunWithElevatedPrivileges调用,代码也会成功。我做了这个改变,它照顾它。
SPSecurity.RunWithElevatedPrivileges(delegate()
{
rootWeb = new SPSite(SPContext.Current.Site.ID).RootWeb;
非常感谢!