代码之家  ›  专栏  ›  技术社区  ›  Christian P.

HttpModule事件-拦截sharepoint重定向到accessdenied.aspx

  •  4
  • Christian P.  · 技术社区  · 14 年前

    对于我的SharePoint安装程序,我有一个特定的用户组,该用户组无权访问网站的frontpage。如果他们直接访问,就会从SharePoint获得标准的“拒绝访问”页面。

    我正在开发一个HttpModule,它拦截对frontpage的访问,检查当前用户并将其重定向到他们有权访问的子站点。

    我第一次尝试使用 PostAuthorizeRequest ,但SharePoint似乎触发了以前的事件,并且仍然重定向到“拒绝访问”页。我已经用一个可以访问frontpage但仍然被重定向的用户进行了测试,在那里重定向工作正常。

    在用户输入用户名/密码但在SharePoint重定向之前,我需要捕获哪个事件才能获取用户?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Hugo Migneron    14 年前

    与其在代码中捕捉“未授权”事件,我建议您使用自定义错误。当用户被重定向到“拒绝访问”页时,SharePoint实际上会抛出一个错误,错误代码为“401”(表示未经授权)。

    在web.config中,您可以为401个错误配置应用程序的行为。如果你曾经在一个web应用上做过一个自定义错误页面,那也是一样的。在web.config中查找CustomError节点并将其修改为以下内容:

    <customErrors mode="On" defaultRedirect="~/_layouts/CustomErrorPage.aspx">
      <error statusCode="401" redirect="~/_layouts/AccessDeniedPage.aspx" />
    </customErrors>
    

    然后创建CustomErrorPage.aspx和AccessDeniedPage.aspx并将它们部署到12个配置单元。

    在这些页面的代码隐藏中,可以重写PageLoad事件以将它们重定向到您希望的任何位置:

    protected void Page_Load(object sender, EventArgs e)
    {
        bool isLogged = HttpContext.Current.User.Identity.IsAuthenticated;
        Response.Redirect("wherever");
    }
    

    请注意,在这一点上,如果需要,您仍然可以访问SPContext对象(我假设您希望根据用户的组成员身份编写特定的代码)。

    这不是特定于SharePoint的行为。所有ASP.NET应用程序都是这样工作的。使用站点范围的配置将允许您仅在需要运行代码时(即访问被拒绝时)运行代码,而不是检查每个页面加载或类似内容的权限。

        2
  •  0
  •   A2ZDinesh    10 年前

    与SharePoint 2013中一样,我们在配置自定义拒绝访问页面时也存在错误,这里解释了如何使用HTTPModule实现。

    Create HTTPModule Step Wise - Explained with CustomAccessDenied Page in SharePoint 2013

        3
  •  0
  •   FlaviuC    6 年前

    使用API中提供的SPSecurity.SuppressAccessDeniedRedirectInScope方法防止SharePoint开箱即用重定向。 用法示例-将代码包装在此代码段中:

    using (SPSecurity.SuppressAccessDeniedRedirectInScope scope = new SPSecurity.SuppressAccessDeniedRedirectInScope()) {
    try{
    catch (UnauthorizedAccessException ex){
    }
    }