【问题标题】:Sharepoint 2010 Custom Webpart - Access Denied ErrorSharepoint 2010 自定义 Webpart - 访问被拒绝错误
【发布时间】:2011-05-21 12:23:51
【问题描述】:

我们创建了一个自定义 Web 部件来显示用户有权访问的所有列表中的公告,并删除了一些。我们遇到的错误是 web 部件在管理员的页面上工作正常,但是在使用普通用户帐户进行测试时,他们根本无法看到页面,并且收到来自 web 部件本身的拒绝访问错误。

只有当用户被添加为网站集管理员时,他们才能看到页面并有权访问 Web 部件。我想要一些建议是如何能够将完全读取权限应用于代码本身中的选择组。

下面是后端代码

using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;

namespace Test.TestWebPart
{

    public partial class TestWebPartUserControl : UserControl
    {
        //Global variable call
        private SPSite thisSite = SPContext.Current.Site;
        private SPWebCollection thisWeb;
        private DataTable dt;
        private SPListCollection siteLists;
        private DataTableWrapper myDataTable;

        //Occurs when the page loads
        protected void Page_Load(object sender, EventArgs e)
        {
            //Pulls all the websites in the site into a webcollection
            thisWeb = thisSite.AllWebs;

            //If the page is not postback call BindToGrid()
            if (!Page.IsPostBack)
            {
                BindToGrid();
            }
        }

        private void BindToGrid()
        {
            //Create a new DataTable along with the columns and headers
            dt = new DataTable();
            dt.Columns.Add("Title");
            dt.Columns.Add("Created");
            dt.Columns.Add("List");

            //Call to populate the DataTable
            dt = SelectData();

            //Populate DataTableWrapper class and get the type
            myDataTable = new DataTableWrapper(dt);
            Type t = myDataTable.GetType();

            //Create a ObjectDataSource to hold data and bind to spgridview
            ObjectDataSource ds = new ObjectDataSource();
            ds.ID = "myDataSource";
            ds.TypeName = t.AssemblyQualifiedName;
            ds.SelectMethod = "GetTable";
            ds.ObjectCreating += new ObjectDataSourceObjectEventHandler(ds_ObjectCreating);
            this.Controls.Add(ds);

            grid.ID = "gridID";

            BoundField column = new BoundField();
            column.DataField = "Title";
            column.HtmlEncode = false;
            //column.SortExpression = "Title";
            column.HeaderText = "Title";
            grid.Columns.Add(column);

            BoundField column1 = new BoundField();
            column1.DataField = "Created";
            column1.HtmlEncode = true;
            //column1.SortExpression = "Created";
            column1.HeaderText = "Created";
            grid.Columns.Add(column1);

            BoundField column2 = new BoundField();
            column2.DataField = "List";
            column2.HtmlEncode = false;
            //column2.SortExpression = "List";
            column2.HeaderText = "List";
            grid.Columns.Add(column2);


            //Provide the SPGridview with the DataSource
            grid.DataSourceID = "myDataSource";
            this.Controls.Add(grid);

            //grid.PageSize =10;
            //grid.AllowPaging = true;

            //Default Pagination - commented out due to not working
            //grid.PageIndexChanging += new GridViewPageEventHandler(grid_PageIndexChanging);
            //grid.PagerTemplate = null;

            //Bind the data to the grid
            grid.DataBind();

        }

        //private void GenerateColumns()
        //{

        //}

        //Used to deal with the PageIndexChange event
        void grid_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grid.PageIndex = e.NewPageIndex;
            grid.DataBind();
        }

        //Used to deal with the ObjectCreated event
        void ds_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
            myDataTable = new DataTableWrapper(dt);
            e.ObjectInstance = myDataTable;
        }

        //Pulls the data from lists which will be displayed
        public DataTable SelectData()
        {
            try
            {
                //Create a new instance of type DataRow
                DataRow row;

                //Loop through each website in the webcollection
                foreach (SPWeb web in thisWeb)
                {
                    //Pull the lists from the site into a list collection
                    siteLists = web.Lists;
                    //Display only lists the current user has access to
                    siteLists.ListsForCurrentUser = true;

                    //Loop through each list within the list collection
                    foreach (SPList list in siteLists)
                    {

                            //If the list is an announcement list continue otherwise skip
                            if (list.BaseTemplate.ToString() == "Announcements")
                            {
                                //Exclude the lists stated from those whose data will be collected
                                if (list.Title.ToString() == "Bulletins" || list.Title.ToString() == "The Buzz - Curriculum" || list.Title.ToString() == "The Buzz - Personal" || list.Title.ToString() == "The Buzz - Support" || list.Title.ToString() == "Critical Annoucements")
                                {
                                }
                                else
                                {
                                    //Create a item collection for each item within the current list
                                    SPListItemCollection listItem = list.Items;

                                    //Loop through each item within the item collection
                                    foreach (SPListItem item in listItem)
                                    {
                                        //Get the url of the current website
                                        string weburl = web.Url;
                                        //Gets the URL of the current item
                                        string dispurl = item.ContentType.DisplayFormUrl;
                                        dispurl = list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;

                                        //Joins together the full URL for the current item into a single variable
                                        dispurl = string.Format("{0}/{1}?ID={2}", weburl, dispurl, item.ID);
                                        //Create a new in the datatable as an instance of row
                                        row = dt.Rows.Add();

                                        //Put the correct information and links into the correct column
                                        row["Title"] = "<a target=_blank href=\"" + dispurl + "\">" + item["Title"].ToString() + "</a>";
                                        row["Created"] = item["Created"].ToString();
                                        row["List"] = "<a target=_blank href=\"" + list.DefaultViewUrl + "\">" + list.Title + "</a>";
                                    }
                                }
                            }
                    }
                }
                //Return the completed DataTable
                return dt;
            }

            //Exception to catch any errors
            catch (Exception s)
            {
                return dt;
            }
        }
    }
}

谢谢

【问题讨论】:

    标签: visual-studio-2010 sharepoint-2010


    【解决方案1】:
    thisWeb = thisSite.AllWebs;
    

    此代码需要管理员权限。在 Elevated Previleges 下运行它: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

    【讨论】:

    • 感谢您的回复,我在研究中看到了这一点。上面的代码旨在根据各种公告列表检查用户权限,所以我担心如果我们使用提升的权限,那么这不会影响该部分代码如何根据公告列表检查用户权限吗?因为它现在会给用户额外的权限?
    • 只是补充一点,如果 .AllWebs 更改为仅 1 个特定站点,是否允许在无需授予管理员权限的情况下运行?
    【解决方案2】:

    基于上述 cmets 和编辑的更改,这里是完整的工作代码,包含任何想知道的人:-

    using System;
    using System.Data;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using Microsoft.SharePoint;
    
    namespace Test.TestWebPart
    {
        public partial class TestWebPartUserControl : UserControl
        {
            //Global variable call
            private SPSite thisSite = SPContext.Current.Site;
            //private SPWebCollection thisWeb;//
            private SPWeb thisWeb = SPContext.Current.Web;
            private DataTable dt;
            private SPListCollection siteLists;
            private DataTableWrapper myDataTable;
    
    
            //Occurs when the page loads
            protected void Page_Load(object sender, EventArgs e)
            {
                //Pulls all the websites in the site into a webcollection
                //thisWeb = thisSite.AllWebs.;//
    
                //If the page is not postback call BindToGrid()
                if (!Page.IsPostBack)
                {
                    BindToGrid();
                }
            }
    
            private void BindToGrid()
            {
                //Create a new DataTable along with the columns and headers
                dt = new DataTable();
                dt.Columns.Add("Title");
                dt.Columns.Add("Created");
                dt.Columns.Add("List");
    
                //Call to populate the DataTable
                dt = SelectData();
    
                //Populate DataTableWrapper class and get the type
                myDataTable = new DataTableWrapper(dt);
                Type t = myDataTable.GetType();
    
                //Create a ObjectDataSource to hold data and bind to spgridview
                ObjectDataSource ds = new ObjectDataSource();
                ds.ID = "myDataSource";
                ds.TypeName = t.AssemblyQualifiedName;
                ds.SelectMethod = "GetTable";
                ds.ObjectCreating += new ObjectDataSourceObjectEventHandler(ds_ObjectCreating);
                this.Controls.Add(ds);
    
                grid.ID = "gridID";
    
    
                //Sorting, Filtering & paging does not work so has been commented out for now
                //this.grid.AllowSorting = true;
    
    
                //Bind the three columns to the SPGridView
                //HtmlEncode must be false for the links to appear as true html
                BoundField column = new BoundField();
                column.DataField = "Title";
                column.HtmlEncode = false;
                //column.SortExpression = "Title";
                column.HeaderText = "Title";
                grid.Columns.Add(column);
    
                BoundField column1 = new BoundField();
                column1.DataField = "Created";
                column1.HtmlEncode = true;
                //column1.SortExpression = "Created";
                column1.HeaderText = "Created";
                grid.Columns.Add(column1);
    
                BoundField column2 = new BoundField();
                column2.DataField = "List";
                column2.HtmlEncode = false;
                //column2.SortExpression = "List";
                column2.HeaderText = "List";
                grid.Columns.Add(column2);
    
    
                //Has been commented out due to these sections not working
                //grid.AllowFiltering = true;
    
                //grid.FilterDataFields = "Title";
                //grid.FilteredDataSourcePropertyName = "FilterExpression";
                //grid.FilteredDataSourcePropertyFormat = "{1} like '{0}'";
    
                //grid.FilterDataFields = "Created";
                //grid.FilteredDataSourcePropertyName = "FilterExpression";
                //grid.FilteredDataSourcePropertyFormat = "{1} like '{0}'";
    
                //grid.FilterDataFields = "ListName";
                //grid.FilteredDataSourcePropertyName = "FilterExpression";
                //grid.FilteredDataSourcePropertyFormat = "{1} like '{0}'";
    
                //Provide the SPGridview with the DataSource
                grid.DataSourceID = "myDataSource";
                this.Controls.Add(grid);
    
                //grid.PageSize =10;
                //grid.AllowPaging = true;
    
                //Default Pagination - commented out due to not working
                //grid.PageIndexChanging += new GridViewPageEventHandler(grid_PageIndexChanging);
                //grid.PagerTemplate = null;
    
                //Bind the data to the grid
                grid.DataBind();
    
            }
    
            //private void GenerateColumns()
            //{
    
            //}
    
            //Used to deal with the PageIndexChange event
            void grid_PageIndexChanging(object sender, GridViewPageEventArgs e)
            {
                grid.PageIndex = e.NewPageIndex;
                grid.DataBind();
            }
    
            //Used to deal with the ObjectCreated event
            void ds_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
            {
                myDataTable = new DataTableWrapper(dt);
                e.ObjectInstance = myDataTable;
            }
    
            //Pulls the data from lists which will be displayed
            public DataTable SelectData()
            {
                try
                {
                    //Create a new instance of type DataRow
                    DataRow row;
    
                    //Loop through each website in the webcollection
    
                    {
                        //Pull the lists from the site into a list collection
                        siteLists = thisWeb.Lists;
                        //Display only lists the current user has access to
                        siteLists.ListsForCurrentUser = true;
    
                        SPBasePermissions perms = SPBasePermissions.ViewListItems;
    
                        //Loop through each list within the list collection
                        foreach (SPList list in siteLists)
                        {
                            if (list.DoesUserHavePermissions(perms))
                            {
                                //If the list is an announcement list continue otherwise skip
                                if (list.BaseTemplate.ToString() == "Announcements")
                                {
                                    //Exclude the lists stated from those whose data will be collected
                                    if (list.Title.ToString() == "The Buzz" || list.Title.ToString() == "Test 2 list")
                                    {
                                    }
                                    else
                                    {
                                        //Create a item collection for each item within the current list
                                        SPListItemCollection listItem = list.Items;
    
                                        //Loop through each item within the item collection
                                        foreach (SPListItem item in listItem)
                                        {
                                            //Get the url of the current website
                                            string weburl = thisWeb.Url;
                                            //Gets the URL of the current item
                                            string dispurl = item.ContentType.DisplayFormUrl;
                                            dispurl = list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;
    
                                            //Joins together the full URL for the current item into a single variable
                                            dispurl = string.Format("{0}/{1}?ID={2}", weburl, dispurl, item.ID);
                                            //Create a new in the datatable as an instance of row
                                            row = dt.Rows.Add();
    
                                            //Put the correct information and links into the correct column
                                            row["Title"] = "<a target=_blank href=\"" + dispurl + "\">" + item["Title"].ToString() + "</a>";
                                            row["Created"] = item["Created"].ToString();
                                            row["List"] = "<a target=_blank href=\"" + list.DefaultViewUrl + "\">" + list.Title + "</a>";
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //Return the completed DataTable
                    return dt;
                }
    
                //Exception to catch any errors
                catch (Exception s)
                {
                    return dt;
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      应该使用SPWeb.GetSubwebsForCurrentUser()。它获取当前用户有权访问的子网站。在绝对需要之前避免使用 ElevatedPriveleges。

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2015-08-24
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多