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

时间:2023-03-09 01:05:07
SharePoint _layouts下自定义程序页面权限管理

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

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

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

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

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

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

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

aaarticlea/png;base64,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" alt="" />

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

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;
        }

运行效果如图:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgIAAAEPCAIAAAC/UTvYAAAgAElEQVR4nO2de3Acx33n16WcnZQvFV9cqkvih0LJgH2OU3flOAcbdZdzYjrniiNbdFS25CtLvIoFxnIUuyjKkGRZBiNTtRItCZZ1sikShmgQJiiQAogVwQdIEHwA2MVjl3gTWoIAuCCJ14ILLgiKIMi5PwY76OnpnumZnccC8/3U74/FTD9+09Pz+/Z0zwwC1wAAAPiYgNcOAAAA8JIlGZidnR0dHe3p6YlEIidPnjxx4sSJEydOnjzZ1tbW09MzOjo6OzvrraMAAACcIDA1NdXd3d3U1NTR0XHu3LmJiYlUKjU7Ozs7O5tKpSYmJuLxeEdHR1NTU09Pz/T0tNcOAwAAsJNAU1PTwMCA4WB/dnZ2YGCgqampr68vnU674xwAAACnCczMzMwJk0wmo9FoJBK5cuWKeC4AAAA5S8BCnsHBwVOnTh04evLoqTYYDAaDrWizIgNzc3OJRKKtre3GjRuSHXR1dY2Pjy8CAABwHYsyMDc3Nzo6eubMmcXFxexl4Pr165FIxJaiAAAAmMK6DMzNzfX394+Ojtrix9jY2ODgoC1FAQAAEIcrAy2t4XCkXV8GUqlUW1vbwsJC9n7cvn07Go2mUqnsiwIAACBOIM2iLnTgqWdKnnqm5FhjEzOBwtDQ0NDQEFXoli1bXnrppW3btr322msvvfSSzkaSdDrd3t5+69YtEb/n5+f7+voaGxtDoVAoFGpsbOzr65ufn8+yOQAAwG8wZEDRgKeeKflJyXNXr17VkYHZ2dlwOExN65eUlCgRPxgM6mykOH/+/PDwsKHTY2Nj77zzTktLSzQa7e/vj0ajQ0ND+/fvD4VCiUQi2yYBAAA/QcsAqQFPPVPS2HRC/24gnU53d3dPTU2Rhfb29g4ODg4NDcXj8YGBAZ2NFLdu3YpEIteuXdPxOJFIHDx4cHJyMp1Ox2KxUChUV1fX3NxcU1MTCoVqa2tXlhLE4/GysjKnaykpKXG6Ck8oKSlJJpPu15tMJr2qWhx3upavUM77iugA4qhkgNIAwxkhmdHRUXJeaPv27b8WYPv27UyHrly5Eo1Gee5eu3Zt//79yWRycXHx5s2bV69ePXXq1L4MBw8e7Orqqq2t1RcSr5C7DrXR3muVWYWUAzJAORYOh8PhsPJnKBQqyRAKhXgZlTTxeFzZYuOlWFZWpq1C53B0qiaLcqHxXeha7hCPx+UWI7tH7rD6ZcCaBqTT6cnJye7ubqXE14Xh+TQ4OHjx4kXmrq6uruPHjy8sLCwsLCSTyX379lWr6e7u3rdvX1dXl/1NlTVU7JOx91plViE5LANlZWX6QVMiHJOvH+o6D4VCvBKUjGRoVlrMdhmQS8v+IifbRA5thk2UDS50LRdIJpPKIEBpf5HeRWEhi89ZelIo9E49qQFM+3+/eoP5vNDVq1fb2tqUEn8pDM+nhYWFtra29957T7urvr6+s7MzkUh0dXXt379/j4bDhw8PDw/X19c70lrZwYws9l6rvODluQyQV3U4HA6FQoIyoAy+mK3kkAzILmUzIKXahHeXZhcudC2XURoQMuACgXQ63XTylKEGyMa7IWhtbVVK/IUwOm5NTk729PRot1dVVR04cKC2tnY3i7q6uqGhoenp6aqqKvo4A4H6+vpAICD/UH6XlpaSaRSUjaWlpdRGakthYaFSSGlpaWFhobxRrkL+U9Jck+SMAW876b+yUY5N4XBYm0znsleSKYNxZXwqx2VtCVpPyFim/KaOQtAxKsiSUyhkMsof7bUtN4icURlIao9RyoQGsrWpJpX4MqDfFKQPZFGUt+QWbdWyq4rPzLkRXt8w27VsqVSnqbV9QGl8MqWcTGltcjKQ17uYR0FVR2Uh95o9fO3RKY5prwWqEUpYvYLyP3dEOpBOpw8fOWqjDLwsjI5bOjJQSbBnz57Kysra2tr9+/dXVlb29vbOzc1dvnx59+7d9HFmIrIcnYuKiiRJisfjSnAnJUFOQyWQ0W6pr69XYr0c/eUfVDJywEt2l1AoRHZxMiKXqAONUhRvaKk/plbSUOWTQUQpgekJUwYkIsCJO8Yba5OtQWVUrlLquOQjIqdxtMcoZZSGzKhEfHLgqZ0UMmwKpg86MsCsWglbchVkgUotzL4hCXcteytVqtBpGfLYlY1kOXI3oGSMmpGj5JPazqtO5G7A8PB1jk4/mcTpFSXqcUluycDs7NXfVVWLTAoxNWB2dpacFNoqDM+nmzdvRiIR5qRQXV1dRUVFRUXF6dOne3p6hoeHDx06FA6H9+7dW1FRMTAwMDY2FovF6urq6OMMBJQToP1NhnIZJaDLo36yVzG3yKMJJfQr2WXITkN1euVP7ZBZ7s3MMb4cEMl5AP1pB3KXdrBGdlMdTwxlQNwxnSkXJTszo+y8dgZZUo/leQNS+Tc5MiXHa+RNiVyUSFMwfWDKQDKZ5FVNFqL9zXNDEu5a9laqPSNUd6L6AJVRv8PwEuschX4JPPQPn3l0TBngNQLVK3hnJxcIZEK5Sgme/snm1nDE2hJxUBieTzpLxB0dHTt37mxoaJiZmUmlUqlU6tKlS4cPH965c+fOnTsrKirk3+3t7fRxmpcBsifJo3velqKiotIMyl5SBuTZcPm3KRlgXo1kAqW3kVVoIfsuuVSruCcjl8DzREQGBB3TlwHFK94RlWRGVdqLjXeMlAwwm5QUEl5KbVOIyIDOWdYWIhiRtc0r3rWyrFSG19RKYqVMUzLAi+n6cZNXnf6kkM7hM4+O90PbCCtSBrJRAuqB0S3CMB26cuVKLBa7ffs2c+/c3FxFRUV5eXl3d/dMhlgstmfPnvLy8l27dr311lsVFRVzc3P0cerKgKSZFJJVQVYIeaMc2bVb5GSFhYWkclAyQF0GJZx7wxL1PThzWjwcDstdiipZfwRUohnmkzOzyWRSdoO8ErSekLe3ZHZyZCroGCUD5Iy8EtTIjEniGRJJffuic7ExndQ2KVkjJQP6TUE5I3FkQB7Gkm2rrdpwZMrrG+Jdy65KlW7AbGpeH1AqpZYE5PGHfnznTXnpVJf93QDv6KgfvP7G7BW8s+M5qvcGtEoQjrQbykBPTw/5+thzwmi9uXXrVnt7uzaIkwwNDZWVlVVVVU1PT8uiPTk5WVlZWV9ff+jQoZ07d2o/biEJyIDEWSIuKiqSt8jLCcwtkiQVFhZSfyoykNQ85ULe3lLXADlsUTYmiTUoeYvyoL1yMeh3KTIaKhnJKqhJeZ4n5HpsCTFsL8lMswo6RsmAUpGSWJuRHNbxJouVEKx1kgoNZJOSV6ZWBphNISID2oPSqdowIvPcEOxa9lZaQoy7tU1N9QEpIwNUOWSXI3WiRL0SRvYu5lFoqyOz6GB4+NqjY04KMRuB2StI/3NrifiqmlRqllQC+WMSOmg/JrFly5bNAjz//PNabwQ/JnHu3Lny8vKamppwONzc3Lxv376ampra2try8vJz587Z1zj2kOWjh+5U4ZCTlot1odFWASullQSH57mPdu7LMrk1KaSN7KQShA4c1JeBoaEhuyLvtWvX2traBD8tl06nI5FIdXW1fG9VXV0diUTS6bQtntgLOS5wp4oSNYZXoI2dW98xFzL6ipXSSqtGBrIcwlP3/bkj4QwZkJXg0JGjDUcb9TUglUqFw+Hr16/b4kpnZyc+NO0+8p3s6rhKQW6yCmQgznpe2SzUpJBdvmUPWwZEmJubGxgYGBkZscUP/NsZAADwBOsycP78+Z6eHt4jPaa4fv16W1vbzZs3sy8KAACAKSzKwOjoaEdHhy3/d0ySJOpZIwAAAK4RmDXPwMDAyZMnd9ceevvgcRgMBoOtaAtMTU2JC8Dk5GR7e3skEpmenrY8mwQAACB3CBw/fry3tzeZTOoLQDKZ7O3tbWxs7O/vT6VSFu4hAAAA5CCB6enpM2fOHDt2LBKJyB/zmZ6elj/XMz09ffHixcHBwUgkcuzYsTNnzkxOTnrtMAAAADtZWhtIJpNDQ0OxWKylpeX48eMNDQ0NDQ3Hjx9vbW2NxWJDQ0OGtwsAAABWIlaWiAEAAKwaAikAAAA+BjIAAAC+BjIAAAC+BjIAAAC+BjIAAAC+BjIAAAC+BjIAAAC+JvDY3p7H9va8dPRdrz0BAADgAYGTQ3NN8fSjVTGvPck5RiZn3ugef+zU+MMnph8+NfNvp8Z/2315eGLKa78AAMBOAnW9qQMDs9/7XYfXnuQQUx17a6PnvrKjOe/VEwWVp/+2/tJXjk59/p2LX9zTU9E+0N5x4sqVK177CAAA9hCo6b5S15faUBHx2hMO0WBBoCAYNblLn+r1OvmSifPnNqx59uniDSUbd2+/d93WH33kd/1rakb/455zH3s1/C+Vp4eHD/c2bTVfqxksH5q36DYsACA3CeyJTr3dfaXozdP8NNFgQSDAuL6r1zM3W6J6fSCwvpqutSAYdV0Gzp86cPbBvMQP8y/++ydGXv3zgidf/MjLtf+hrPsP3uj60AvN//Wp2tT06auJrckL1ZwCUpkWk1mvk063gOxbtnp9Vk5YqhAyAMBKI/DdV/ZWn0k+Un7q0uQ0J000WBAoKCigLvClUGf6so8GC1hRidYBTjJTZfLQjVb9O4ovPJJ34d/yLz6bP7Ll7oEffvGXJd//8Aun7nz26J9sOvCnj1S8UbdPmg5eHvw+3xfSmer1ek1Eem7yKAwgGzQaLJB/mq3CzoYFAOQmgbVPbvv3o6MPvX7we+UnjpwZYqWJBgsC64NUQIgGCwqCQQuXPS+yqHXAXPyxM1oN/OBzIw/nj34/f6w4//Ir9/zskfvyf7jnoxtDd/7LW3/44Lbf//rPq98pu518/eyhAhs8cU4GokFat7N1TwDIAAArkMDXn3/rh6FzD71+8MjZ1He3H2WlWYoFqmtc/oPexJgJIeZH5DIyaOIFNXwNaMav6qJIv6gyl7cQlZDu6d3EnHngrvP/J2+kKL/ngfxnv/Lf//JbGz/47Tc++OCv33/v1g98ueQDBY8tpCpuz/w4tP1/zMzMMJpKLw5SjpGeFxSQvi0fdfX6QEEwuJ5/ODwx1k6zaRqKblClTeXpPrVLWTcsACA3CWyqOCnLQGXn9EOvH2SlycSk5cBCbCEChFoRyEjNKo1fjyb2c4pipleplbJdFRPVvtKEv3bXu/fnDT+cH/m7T1Y++Pn//MXvf/QfH//f333kw2uf+MPPbrjrcw9eP/ulxdH83j1rGJnpyskYy3SMczegkgGy1eUSaMVkH85SfOZNtUWD6zO51GeWyGJnwwIAcpPAjshlWQZeO335O78MsdKoYlZBMLocELQ/6CxyKCL36cwzZHaxY6OmKKYMqMemSxko93TnLhrWf7nnq3nnvpUXfzBvZEP++Y2fGnky/+A/f/Le+9b9p0898Gxx4Xzzn10Lf2jwt99iZGaUXL2ebAl63CwiA2TwzdxFCB/OkhhpylXtXU5BJbCzYQEAuUng5ZMXFRn4dmktK406FpCTEHoyQId+ciaCN90s71OlYAcuKoTSHjKeaRKOVm3bXg7/TV7/vXlDD+YNfSfvN2v/4v5P/vXH7/6HO+/+2t1r/rZv5z0zez8y+Pya6Js/Z+XWFk3IgMFkvSMykEmhufkg7yLY91UpexsWAJCbBF44nlBk4MGf72OloWYGiEkDnUmhTMwP0jFOd9VR+1ASkY8uijspRE5TLN9JGM+ipFKpVOri+fNHvvjf2v5XXv+9eUMP5A2vz6/5xl88+oW/3voPf5V4On/6hXtGn8iru3dNovUQ9wjo0Kj1QXHMkgyIHI7ycJCqEHZYJx5u4stA1g0LAMhNAluOXZBl4BfHEw+9YigD6j8Eloi1z67rPmmqCSXMaQne6jF35VO9umn0gFO0es/h//Ln4b/J6/lq3rv35w19O2/44bwLRXljj+WNfDev576P9Zb+mJ9b/doAeTQsx0jPl38byABZFPdwSC9Y1RFFrF/PuRuwuWEBADlI4Lmjo7IM/N9X9jWeiXvtT06QSCQqi4v3fvpTpwryOr+U1/OPeQNfzxv8p7zu+/L2Fny8/LFHzp4967WPBJiKAQBkQeCbwd3fDO4uLj88Nj7ptTO5wvT0dDgcfuWnP33xfxbuzL+n7lMf3/+Zj7352Xt+9Xefe/WxR48cOTI+Pu6pg+SMDx7PAQBkRaCzs7Ozs7O/v39kZMTr6JZbjI+P9/X1NTU11dXV1dTUNDQ0xGKxsbGxnPiuHDE/Aw0AAGQD/u0MAAD4GsgAAAD4GsgAAAD4GsgAAAD4msCbAAAAfEwgsLEFBoPBYP417z2AwWAwmIfmvQcwGAwG89C89wAGg8FgHpr3HsBgMBjMQ/PeAxgMBoN5aN57AIPBYDAPzXsPYDAYDOahee8BDAaDwTw0C3mKuiVJShZ57jrXYqUTkjSRKPTeExgMBst509u3Kyktsxz3XZIBVe2SJEnxhphYXlMyMFhvomQYDAZbdcbbUdgwL0nzpVszW7Ym4t2D8m8XZUDtgCRJGR9ss62JOGQABoP52Tg79MbI3siAVplsMcgADAbzuXF2DNbzh94ZGRisV+Zr1CkLG+Yl1q6ibkmaSBTKsz3KpI08zNeWo5EBzRbCAUmq36VsV00K6Xhb1G1t0gkGg8FWkXF2xEonqNi6bJnombkh2JVUxdBdyeXf6rF2UbckTczHyVl7VQK19rDvBriVEn9qZYDvLe4GYDCYz42/LzN81qy1FnVL6gCtsySrjci6GcnQT8mANtCrb0GIqSozlUIGYDCYz01/9/K0CTW3o14bWJrtobPTQkJn1IbgrYm4cgtCPylELxfTsXtZNpiTQhxvIQMwGMznJpJoSQwEA+ty+E4WqXfRakGuCmhn+bVrA+qM9ITVrmQmL2QABoPBhE0wHfmUjm5gpR8xMpQB5vJDYKOxDOBuAAaDwWww0XREUNYLrHRkH6yX+DLAmuJn1qgxs2sDkAEYDAbjGGfHYL0qdIoHVtXTPozZJGoJQfvcjmpyif+WAOtJoYz8mJEB3UdjYTAYbPUbf5/qqXx6nsdofK3k0psUko1cCuY9NcQ01dIC91kg4wXtjAO4J4DBYH407z2AwWAwmIfmvQcwGAwG89C89wAGg8FgHpr3HsBgMBjMQ/PeAxgMBoN5aN57AIPBYDAPzXsPYDAYDOahee8BDAaDwTy0NAAAAB8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8DGQAAAF8TSAEAAPAxAQkAAICPgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvgQwAAICvYctAYGMLDMY0lzsoAMBpIAMwc+ZyBwUAOA1kAGbOXO6gAACngQzAzJnLHRQA4DSQAZg5c7mDAgCcJhdl4MM/afvSr/o21Y1Udk71jc97HvhgpLncQQEATpMTMnDXc533/ebs5sOJut6ZC1dueOsMTN+c75MAAFfxQAZ+b1PrZ148853K+MsnLjXGUzPzNw1c9DrwwUizq+fFG2JKmYUN83YVCwAwixsy8MEnw194tefRfeffaB1vv5C+fvOWORe9Dnww0uzodcmijS2BrYl45u94Q6yo23Qp8YYYWQgAwBqOyMCdz7b//bb+H4VGdkenzk7M37qdnYteBz4YaVmdS0mSJKl+V0tgVzL7ciADANiCPTJw95boN8rPPnck8U7/zMVZenI/Wxe9Dnww0rI9nROJwo2x0gne7mRRpqLM/cF86daWou750q3y9qW89bsIr5ZEhZdX3j5Yn63rAKxO7JEBZ130OvDBSMv2dHYP8iPyfOnWzDrBslrIAkBE/8wdgPpuQCcvBAAAPSADMHOW7enUkQHVLiWsE/FdkkP8UhqVDIjkBQCwgAzAzFm2p5M/KUQ+OySbEsqXF5A5MiCUFwDAYiXJwAuNFxOpG5IkXX1v8e3u5Gdf7vI8JvrQsj6f/BF69yBryVdIBoTyAgBYrCQZoLYvLN7+1m8HPQ+LfjMbzuhEonCj6mGh+l1ysE4WEe8Q1O+Swz1XBtQTQQJ5AQAsVrAMSJJ0Y/H2mp91eh4ZfWU2nVXlyZ+WwEYqylMb+TKgPBokK4phXgAAi5UtA5IkbT1+0fPI6Ctz9FwDANxnxctA+4W055HRV+bouQYAuM+KlwFJkqJjc/e/iUUCl8zRcw0AcJ/VIAMyR99NfXRzh+dRctWbo+caAOA+q0cGJEmaTC984dUezwPl6jZHzzUAwH1ckoH5hVuvN49/+dd9H8kM2D/xfPRrZQOjM+8Zu8ipZWHx9kO/i39v79BEeoGs6PO/gBI4aIbnCwCwsnBDBuJT1z/xfJSZ8dT5q8YuZhK/yHl97EM/btvbNa2kn567idkh58xM7wIArAAcl4HktZsff477aL8pGZDtfY8zynnf4y2vnb6sZDkWTzGTwbI3sz0MAJDjOC4Dmw8nlGR/9HTkBzXD21rHf1Az/FcvdwUsyQDP3vd4S03P8oup38QLxs6Y2R4GAMhxHJeBv9x6Rk5zx6bWsxOqL8kci6fiU9eNXRR244+faZuaW/qXll2XrnkeMVelCXctAMDKwHEZ+IPisJxmzc86LbpoxpPH60aUjAuLt5uHr36j/KznoXM1mbWTCADIWdyTgfc/0TqWsvKPycTdeP8TrcfiKW0Jr5y45Hn0XDVm4QwCFsM71uWv2zHstRsrm8ZitKENOC4D5IP8n34h1jdu+n+AiLvx/NExXiEPVLzreQBdHWb29NnC8I51+fn5+fnZXvONxaJlLNVY3JhNdUalZ39APgZtaB+Oy0BVbJpMecem1u/tHUpdXzThopgPH/hReJZfbHgUnx6yx8RPnGWUC1wJwmwZaCw2GaYbi4UDh4mkllgNQWzpGDw7gNXQhrmB4zKweIvxXwHufLa9Kjatk8uCM59+IaZTyMLibc8D6OowwbMmiBJt2ShRPpNu+Xq3EKeVLMbiYSKpVZaDmPVKDJrPIjx3eLXJ6YnjESbb8L3skcmSrDhrHuc6j8248frYjcXbRW8NaXO91HRJyEUxHyAD7pjIKdPB5PWXuZA0MtC4Y906bTJdcksFlmtZt6NxeDirEmyGOGix01XcKJxUTdajeKs3JJABFe59U+jgwBXqX8TcsanVxvcGMCnkjomcaz1ELkDtVa29G6CLMrrkzCwvZKMCzkRmg2axF/Ko9WsgU9onA47GaLlKyIAKVz8tN79wa+P+YTLj18oGjF0UdgNLxC6Y4LnmowosxY0SJ8ar0S4XUNsN8ltSAUtjVU9kQN9TweNhtzFxPMWNmSSskvT2mUvrggyYwp17Qy/x4Auj//r2eSXjHz/TZuyisBt4YNQFM3WuxchCBiR9JRCNyWQ2M0GI4fFqkwFmEl/JwOpXAedl4HyS/oZoR2JOyXjHplZjF814gtfHnDaBTmWW7GRA0okqFmTAVAxieONq0FjlMpATDwBldW+4QnBcBtb8rLOyc4rcsiM8oWT8k5+2G7so7AY+JuGCCXctcUQutEwanadY9GKysAyYG8xDBsT2mUubUzJg5rBWLI7LwB89HQlsbPlkMPavb5+XPyqnvFcc2Njy7V3vGrso5sP7Hm95uxuflnPczPYwAczIgLmr0SiX9gEkoSCulwoy4IAM2DBNZHxQNrESp45ckgGm3bGptSMxZ+yigAP40LRrZraHkbjzfEb+cvwwKQOiw1B7ZEBOyU9mtF/rf1ap7JIBK+eJUxJkwCXcmBRiZnn/E62/7ZgUcjGT5QX825kcMDO9iybHZUA4gpuSgeEd6yyt7oq8I+v0A6OC5dv83gBkwG0cl4H0e4vbWse/un1A+eczn34h9s97zlEfndZzkVML/gmlJyZ41pjktAyYmJEWlwGdQg18E/pSgl9kwDS0M3qxWeAuSIAV/TwR/iU9zPNzLTJpYe1aFZeBRjOhR69YKhzwQ5pBsBP6WEYuyoAbS8S6X2elnDbsMJCBVSQDR99NYS7IBXPgDAvNXVtaIzY3KTS8Yx31w0KxdDjghwfdwCH2ySR31wbc+pSbgQyQI329twlFI7KADAjEeMiAxzIQHZu7/008F+SSOXCG7ZCB4R3rGBeg6SeFJFOXvIgMWNMBwQ/nuSoDRIz1VgaGh9UDftlf1jZz1UEGqK3ehwaGM8y97RfwsSBXzYEzLBSmdC/W5RCg3mtFBgRisCkZ4AcIgQkjg6DipgyQI226pKwmpzTVia0NcNcizGoUZGDly8DW4xc9j4y+MgfOMCNMkXGFml3RiZmWwxM/H+ui1g1T2nDAj+m80CGqAm7KAP3NDtX7el7IAKtiS3cpkIEVLgM3Fm/zHkiFOWQOnGGDILJ0XXGuVtWnz0yWrBM+9ObBTcoAPz0n3AurgIsywGlJegHECnwZMDm3L57FbHWQAY9CA8MZavvCIuMf2sCcNlvOqamwwf2fA6pymDHOugzo/VsYoXjJXG7g3nWodghHFMF4mb0MZD7rX1y89ITPOu4NmLW6uY7Y/Ywxww8TMiDy7C5kwBkXM7W8yHl9DOamZXMqxa9p3bkY7RDUyiS+8X6eEOjFDfbI31gHiKLEA4pD72Hw1rKXH6tdt2OYaH67PwJCNkBOyIDILBVkwCUZkA1fifDWsjqX+he1UaggQoreeiU7h6X97GUHvbjBiQYmVgEEHxJSJbUXjo9Es0minFkAAAcuSURBVC+5JuBqNjKgeqnPJizJgEiIhwy4KgMwby27k5m5WFTXinCoYIS97GbFjWtmzdNbkAHudL8mkppQAXdkgDxlmte+2M/pMnKbkAHzr3MZVqLbqOLvSwi9yQcZcMZFrwMfjDQHzrBwqDD8RAAdlbKXAda7ZDpXPDdi8AIRrQ9mVMDsl/CsrA1oXrDjlGR11M7wyXxAFXinRKdE8fcl9ByCDLTcvSX6jfKzzx1JvNM/c3H2hs0ueh34YKTZe3IlSRKXAeNHQuiS7JABU7kE3hVT55KPSdlmRgWEI491GaBrcEMGLHxRSP8AjdrUQAYYzy7rJvOvDFB257Ptf7+t/0ehkd3RqbMT87duZ+ei14EPRlpW55KNSJjSzH+ILCK7LgMi9wlCsUTEIeF4aVkGmHNABsHbJPw2NHFO9LIYt7vpB2X1H0qDDLDtg0+Gv/Bqz6P7zr/ROt5+IX395i1zLnod+GCk2dHrKAwufN4MuMC3I1yWAd3AzPngNKtgcypg09sFzHDYWMxcHLdroC7ohfVKsvwMku7iy0qM9xzckAHKfm9T62dePPOdyvjLJy41xlMz8zcNXPQ68MFIc6ATirwfvLzfzPP8jsiA2bfBhDGlAiZSZ7U2sIPM5LwMWPrcp8DagPkzwpqCZNzzWJKXXMMDGdDaXc913vebs5sPJ+p6Zy5coZcWPA98MNIc6ISMq5i+3taxgpEmZGkeQ8rm9TFDd7kP/WSrAiLZzQxz7XiLWJ3EMRmw9tFnazd1Im4wnVl9YpATMkDZh3/S9qVf9W2qG6nsnOobn/c88MFIs78P0sNaKnbrrgWTKfTfMtbF0stN3K9a5JgKrCAZsDjBbqMMaEI8t8zVJAa5KAOwXLasuxw/NFNP5utfVEIfmLRdBng3Itq47MQbvtoHikw9USS4MGFSBux4eYGa7jMXTrOc/9c7DGM1YmRbgWsGkAGYOcu6y3Hjo/nLh3XpmnoxjbdfJLSRFTHeNnZQBgjvhNpMe5S6zukEUydlQGxlRddze3qQ+bJW/I0BZABmzrLvcxbHXSLF8b7kbFYGDGO4OgNrcO6cDJi7FWAfpU7sFgnCDsiA2XfheK0jhBNPAGlP+Mq5LYAMwMyZyx00Oyw/KaQXJ3TeWHDpwjdZm8ASvGDkMr82YIrhHeusfk7PrEdODeCzXSHyBsgAzJy53EFXDCIhbKXWRlbrpAy4Subj2Q4cSmPxihIBngwAAADwCZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZABAADwNZAB4CYXqjasDTY7WUNzcC1Vg3ZLLsD0KjddBasdyABwE64MXKjasHZD1QXOn6bKV+ezWpKzcLyCDAAvgAwAN3FYBrTFO3/7YQWeV5AB4AWQAeAmcvy7ULVhrYwc85qDa5cJNlN/ZqLj8ualSKnRCt0JIblqpZBMuWSBmWRrtZu1SdVbqKozrpGVLu9WJyaOK0ju4Hii2pHZzjoSAAQRlIHL9ZuLNtdfdtYXsPqRI9hS7G4OKj/17wbUYVTJRstAc5C+gyC3yFXLhSwFUuIPzU/yD7Ki5iq6anmLKrQrf5CVcr0i28DAk6W2WN5R1cxyBgAzcGXgcv3mIn3KYm46ClYF6shNzI0YygA11NaOeo2WBVS5VLuUP+i7iczfqpisZOFPPy3HecbklmoTVaPyp54nmskyhjMAmEBPBpbjfKwM9wLADtQRPAsZYMZC3WUBjQxoNEFTLrEhM+tC36KsVatJJoaTA3wdrxj3M+xon9nAWzzQugeAMPoyECvDvQCwE1tkgBULjZ8TNZYB7hhcVQZ/y1Kh9JyPKr3+oVi7G9BxDwABBO4GYmWI+cAmuDKgGx+bg2vVqwiaKXv9ZQFt1ZwxOTXxvryZ3CYvLtNblN/BIOcImV6R6yPkEgjHE/noCZWp4joDgCiGMrA8H3S5fjNmhkB28GVAmdcgl0LJJ4WqqMeLiOgo9LaAiAwQ9apmWLTP5jCe1lFyc5cx+DP7SwVpxY8117O8g9QGPCkErGIkA9xpIdwgANcweJx+pb8tAIC3cGVAOxWEuwHgEfoysKI/HwGA9/BkgBHzIQPAIxBAAXAQngzEyop0HxTCtBAAAKwK2DJwuX6zNsrjbgAAAFYfTBlgB3zIAAAArD7waTkAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1kAEAAPA1/x+d3Q684nklcwAAAABJRU5ErkJggg==" alt="" />

aaarticlea/png;base64,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" alt="" />

详细的代码如下:

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 > )
{
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 < )
{
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)[];
}
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(, 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();
}
} }
}