以前在编写基于域认证的SharePoint站点时,都没有意识到代码的执行权限问题,因为我基本上都是以管理员身份来登录的。现在把网站认证改为Forms认证以后,一般的用户并不是网站的管理员,导致有些控件会遇到拒绝访问的情况。一个例子是:假如一个普通的Internet用户要往一个Document library来进行写入操作的话就会被拒绝访问。
public void WriteToLib()
{
byte[] file = 。。。。。; //get byte array
SPSite site = new SPSite("url");
SPWeb web = site.OpenWeb("url");
SPFolder lib = web.folders["libName"];
SPFileCollection files = lib.Files;
files.Add("fileName", file); //access denied
}
{
byte[] file = 。。。。。; //get byte array
SPSite site = new SPSite("url");
SPWeb web = site.OpenWeb("url");
SPFolder lib = web.folders["libName"];
SPFileCollection files = lib.Files;
files.Add("fileName", file); //access denied
}
同样的代码如果用户是网站管理员就没有这个权限问题。
那么解决方案是什么呢?我们需要提升这段代码的权限,而不管当前的用户是不是有足够的权限。从SharePoint SDK中看到可以这样做:
SPSecurity.CodeToRunElevated ElevatedWriteToLibrary = new SPSecurity.CodeToRunElevated(WriteToLib);
SPSecurity.RunWithElevatedPrivileges(ElevatedWriteToLibrary);
SPSecurity.RunWithElevatedPrivileges(ElevatedWriteToLibrary);
这样就把我们的方法的权限提高到了系统帐号的高度,问题就解决了。
如果用到SPSite对象的话,则一定要在这个方法内部来创建,不可以用SPContext.Current.Site,不然没有效果.