对于我的SharePoint设置,我有一个特定的用户组,无法访问该站点的首页。如果他们直接访问它,他们会从SharePoint获得标准的“拒绝访问”页面。
我正在开发一个HttpModule,拦截访问首页,检查当前用户并将他重定向到他们有权访问的子站点。
我首先尝试使用PostAuthorizeRequest
,但似乎SharePoint在之前的事件上触发,仍然会重定向到“拒绝访问”页面。我已经对可以访问首页但仍然被重定向的用户进行了测试,并且重定向工作正常。
我需要捕获哪些事件才能在用户输入用户名/密码之后但在SharePoint重定向之前获取用户?
答案 0 :(得分:3)
我建议您使用自定义错误,而不是在代码中捕获“未经授权”的事件。当用户被重定向到“拒绝访问”页面时,SharePoint实际上会抛出错误代码为“401”(未经授权)。
在您的web.config中,您可以为401错误配置应用程序的行为。如果你曾经在网络应用上做过自定义错误页面,那就是同样的事情。在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应用都以这种方式工作。使用站点范围的配置将允许您仅在需要运行时(即访问被拒绝时)运行代码,而不是检查每个页面加载或类似内容的权限。
答案 1 :(得分:0)
在SharePoint 2013中,我们有配置自定义访问拒绝页面的Bug,此处说明如何使用HTTPModule实现。
Create HTTPModule Step Wise - Explained with CustomAccessDenied Page in SharePoint 2013
答案 2 :(得分:0)
使用API中提供的SPSecurity.SuppressAccessDeniedRedirectInScope方法可防止SharePoint开箱即用的重定向。 使用示例-在此代码段中包装代码:
using (SPSecurity.SuppressAccessDeniedRedirectInScope scope = new SPSecurity.SuppressAccessDeniedRedirectInScope()) {
try{
catch (UnauthorizedAccessException ex){
}
}