SharePoint _layouts下自定义程序页面权限管理

在sharepoint中,_layouts下的自定义页面没有特别的权限,只要用户能访问sharepoint站点就可以访问_layouts下的自定义程序页面,现在我们需要给自定义页面做一下权限认证。要求如下:

1)自定义程序页面只为特定的站点服务,如图:

我们的自定义页面只为docs站点服务,只有/docs/_layouts/15/这样的访问路径才是合法的。

2)能访问docs站点的用户不一定就可以访问该页面,所以我们需要给该页面配置一个权限管理的list,如图:

3)有些自定义程序页面比较特殊,比如我们开发一个页面来装在rdl报表,那么这个自定义页面的权限就没有多大的意义了,所以我们给自定义页面加上querystring的识别,如图:同样的一个自定义程序页面querystring不同,可以配置不同的权限

现在来看看我们的实现吧:

protected bool CanAccess

{

get

{

if (SPWebNames != null && SPWebNames.Length > 0)

{

string spwebname = SPContext.Current.Web.Name.ToLower();

bool findwebname = SPWebNames.Any(x => x.ToLower().Equals(spwebname));

if (!findwebname)

{

return false;

}

}

List<string> gpnames = GroupNames;

if (gpnames.Count < 1)

{

return true;

}

else

{

SPUser currentUser = SPContext.Current.Web.CurrentUser;

foreach (string gpname in GroupNames)

{

foreach (SPGroup g in currentUser.Groups)

{

if (g.Name.Trim().Equals(gpname))

{

return true;

}

}

}

return false;

}

}

}

首先看看我们当前的web name是否是在配置的web names,如果不是直接返回为false,如果是就继续检查当前user是否具有指定的权限(当前user是否在指定的组里面)。这个配置我们写在sharepoint list里面,用户第一次访问页面时,我们会往该list插入一条新数据,没有指定特定user group name,然后管理员就可以设置该group names。主要代码如下:

string url = HttpContext.Current.Request.Url.AbsolutePath.ToLower();

if (QueryStringWithPermission)

{

url = HttpContext.Current.Request.Url.PathAndQuery.ToLower() ;

}

string _key = "$LayoutsPageWithPermission$";

.................................................................................................................

lock (_lockObj) //lock to avoid creating more than one cfg list.

{

try

{

list = web.Lists[_key];

}

catch

{

}

if (list == null)

{

web.AllowUnsafeUpdates = true;

Guid listId = web.Lists.Add(_key, "List for config , never delete this list.", SPListTemplateType.GenericList);

list = web.Lists[listId];

SPView view = list.DefaultView;

SPViewFieldCollection viewFields = view.ViewFields;

string fieldname = list.Fields.Add("GroupName", SPFieldType.Text, false);

SPField field = list.Fields.GetFieldByInternalName("GroupName");

viewFields.Add(field);

view.Update();

list.Update();

}

SPListItemCollection listitems = list.Items;

foreach (SPListItem spitem in listitems)

{

if (spitem["Title"].ToString().Equals(url))

{

spem = spitem;

break;

}

}

if (spem == null)

{

web.AllowUnsafeUpdates = true;

SPListItemCollection items = list.Items;

SPListItem item = items.Add();

item["Title"] = url;

item["GroupName"] = string.Empty;

item.Update();

spem = item;

}

..................................................................

List<string> groups = new List<string>();

if (spem["GroupName"] == null)

{

return groups;

}

string str = spem["GroupName"].ToString();

groups.AddRange(str.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries));

return groups;

这里我们首先去读取list,如果该list不存在就创建该list,然后往该list中插入数据,如果list存在那么检查对应的url是否存在不存在 就插入数据,最后返回指定的group names。

最后调用的代码如下:

protected override void OnInit(EventArgs e)

{

base.OnInit(e);

this.SPWebNames = new string[] { "docs" };

this.QueryStringWithPermission = true;

}

运行效果如图:

详细的代码如下:

namespace Microsoft.SharePoint.WebControls
{
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    public class LayoutsPageWithPermission : LayoutsPageBase
    {
        #region Property
        private static object _lockObj = new object();

        private List<string> GroupNames
        {
            get
            {
                string url = HttpContext.Current.Request.Url.AbsolutePath.ToLower();
                if (QueryStringWithPermission)
                {
                    url = HttpContext.Current.Request.Url.PathAndQuery.ToLower() ;
                }
                string _key = "$LayoutsPageWithPermission$";
                SPList list = null;
                SPSite siteColl = SPContext.Current.Site;
                SPWeb site = SPContext.Current.Web;
                SPItem spem = null;
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite edsiteColl = new SPSite(siteColl.ID))
                    {
                        using (SPWeb web = edsiteColl.OpenWeb(site.ID))
                        {
                            lock (_lockObj) //lock to avoid creating more than one cfg list.
                            {
                                try
                                {
                                    list = web.Lists[_key];
                                }
                                catch
                                {
                                }

                                if (list == null)
                                {
                                    web.AllowUnsafeUpdates = true;
                                    Guid listId = web.Lists.Add(_key, "List for config , never delete this list.", SPListTemplateType.GenericList);
                                    list = web.Lists[listId];
                                    SPView view = list.DefaultView;
                                    SPViewFieldCollection viewFields = view.ViewFields;
                                    string fieldname = list.Fields.Add("GroupName", SPFieldType.Text, false);
                                    SPField field = list.Fields.GetFieldByInternalName("GroupName");
                                    viewFields.Add(field);
                                    view.Update();
                                    list.Update();
                                }
                                SPListItemCollection listitems = list.Items;

                                foreach (SPListItem spitem in listitems)
                                {
                                    if (spitem["Title"].ToString().Equals(url))
                                    {
                                        spem = spitem;
                                        break;
                                    }
                                }
                                if (spem == null)
                                {
                                    web.AllowUnsafeUpdates = true;
                                    SPListItemCollection items = list.Items;
                                    SPListItem item = items.Add();
                                    item["Title"] = url;
                                    item["GroupName"] = string.Empty;
                                    item.Update();
                                    spem = item;
                                }

                            }

                        }

                    }
                });
                List<string> groups = new List<string>();
                if (spem["GroupName"] == null)
                {
                    return groups;
                }
                string str = spem["GroupName"].ToString();
                groups.AddRange(str.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries));
                return groups;
            }
        }
        protected bool CanAccess
        {
            get
            {
                if (SPWebNames != null && SPWebNames.Length > 0)
                {
                    string spwebname = SPContext.Current.Web.Name.ToLower();
                    bool findwebname = SPWebNames.Any(x => x.ToLower().Equals(spwebname));
                    if (!findwebname)
                    {
                        return false;
                    }
                }
                List<string> gpnames = GroupNames;
                if (gpnames.Count < 1)
                {
                    return true;
                }
                else
                {
                    SPUser currentUser = SPContext.Current.Web.CurrentUser;
                    foreach (string gpname in GroupNames)
                    {
                        foreach (SPGroup g in currentUser.Groups)
                        {
                            if (g.Name.Trim().Equals(gpname))
                            {
                                return true;
                            }
                        }
                    }

                    return false;
                }
            }
        }

        protected string CurrentUserName
        {
            get
            {
                string userName = SPContext.Current.Web.CurrentUser.LoginName;
                if (userName.Contains("|"))
                {
                    userName = userName.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries)[1];
                }
                return userName;
            }
        }
        public bool QueryStringWithPermission { set; get; }
        public string[] SPWebNames { set; get; }
        #endregion
        protected void RedirectAccessDenied()
        {
            Uri uri = HttpContext.Current.Request.Url;
            int index = uri.AbsoluteUri.IndexOf("/_layouts");
            string urlprfx = uri.AbsoluteUri.Substring(0, index);
            string url = urlprfx + "/_layouts/15/AccessDenied.aspx?Source=" + uri.OriginalString;
            HttpContext.Current.Response.Redirect(url);
        }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (!CanAccess)
            {
                RedirectAccessDenied();
            }
        }

    }
}

SharePoint _layouts下自定义程序页面权限管理,布布扣,bubuko.com

时间: 2024-10-13 12:48:58

SharePoint _layouts下自定义程序页面权限管理的相关文章

SharePoint自定义程序页面部署 不用重启IIS

SharePoint的部署方式默认是部署WSP包,尤其是有多个前端的时候WSP包的部署显得非常方便和快捷,但是WSP的部署需要重启整个IIS服务会造成SharePoint站点一段时间不能访问.结合自己项目的情况这里我们提出文件对考的方式来替代WSP包的部署.这里有两个地方需要注意: 1. 我们的SharePoint项目不会影响SharePoint内容数据库: 2. IIS不重启,但是SharePoint站点对应的应用程序池会自动回收 这里我们以一个demo来做说明: 如图我们的SharePoin

MVC自定义AuthorizeAttribute实现权限管理

[转]MVC自定义AuthorizeAttribute实现权限管理 原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html 网站的权限管理是一个很重要的功能,MVC中怎么实现对于网站的权限管理呢. 在MVC中有一个名为AuthorizeAttribute的类,我们可以创建我们自己的特性 MemberValidationAttribute类,然后继承AuthorizeAttribute类来实现我们自己的网站权限的管理.然后通过将

使用SharePoint创建并自定义网站页面

使用SharePoint创建并自定义网站页面 1. 打开SharePoint Designer 2010. 2. 左侧导航点击网站页面. 3. 在功能区点击Web部件页面,新建Employee.axpx. 4. 右击签出.这样这个文件被锁定,只能由你编辑. 5. 点击打开属性窗格. 6. 点击编辑文件. 7. 点击代码视图. 8. 添加一个<div>标签,将在这里添加一个ASP.NET控件. 9. 在工具箱,标准ASP.NET控件下,拖一个XML控件到<div>中,并重命名ID为x

MVC 自定义AuthorizeAttribute实现权限管理

[Authorize] public ActionResult TestAuthorize() { return View(); } [Authorize(Users="test1,test2")] public ActionResult TestAuthorize() { return View(); } [Authorize(Roles="Admin")] public ActionResult TestAuthorize() { return View();

SAP云解决方案和企业本地部署(On-Premise)混合架构下的安全认证权限管理

SAP提供了用户认证.权限管理和单点登录等安全相关的解决方案.但是随着云平台的兴起,企业已经部署的安全解决方案如何与云平台的安全解决方案集成呢?这是摆在我们面前的一个问题,而且是一个至关重要.需要认真思考的问题. 本文将探讨SAP提供的本地部署和云平台的安全解决方案产品集:SAP Single Sign-On, SAP Cloud Platform Identity Authentication, SAP Identity Management, 和SAP Cloud Platform Iden

django 自定义user使用权限管理模块

这篇文章主要是讲如何让自定义的user模块也能用到django.contrib.auth中的权限管理模块 看这篇文章之前请先看一下我前边的两篇文章,本文以这两篇文章为基础: django 自定义 USER 用源码告诉你django权限管理是怎么回事 下边是一个大概的实现,后边再做详细分析: 1.user model自定义 class AbstractUser(models.Model): # 登录信息 id = models.AutoField(primary_key=True) staff =

IIS下自定义错误页面配置的两种方式(亲测可行)--IIS服务器

网站自定义错误页面的设置,大家应该都知道它的重要性……不多说,下面带大家一步步在IIS下设置网站自定义错误页面…… 1.首先进入你的网站主页,找到[错误页](注意是IIS下的错误页不是.NET错误页),双击[错误页] 2.这样就进入了错误页面,点击[编辑]或者双击状态代码行,打开“编辑自定义错误页面” 3.填写状态码,响应操作处选择第二项[在此网站上执行],输入URL 4.查看错误页面相对根目录的位置,按照示例填写就可以的.然后依次设置其它页面 5.当然还可以通过修改配置文件(web.confi

Sharepoint 2013 WorkFlow 自定义任务处理页面(1)

SharePoint工作流使用设计一般分为三中模式: 1.wf 自身提供的一些流程模板:三态,审批,等等. 2.使用sharepoint designer 和 microsoft visio 设计流程 3.还有其他的第三方工作流平台,以及使用Vs 进行工作流的设计开发 以上内容我就不一一介绍了,相信大家在看我的博客的同时已经开了很多工作流大神写过的工作流文章,请大神勿喷,小弟的文章仅供学习和参考,下面我们就开始创建工作流: 注:如何创建sharepoint网站和一些关于如何操作sharepoin

Linux下SVN安装与权限管理

cat /etc/redhat-release //查看系统版本号 CentOS release 7.1 (Final) 这里我们採用yum源安装方式: 1.安装svn yum install subversion  -y 2.建立SVN根文件夹 mkdir -p /var/svn/ 3.启动SVN服务指定服务的SVN根文件夹 svnserve -d  -r /var/svn/svndata/ --pid-file=/var/svn/svndata/svn.pid 4.查看 SVN 进程: ps