События HttpModule - перехватить перенаправление sharepoint на accessdenied.aspx - PullRequest
4 голосов
/ 24 ноября 2010

Для моей установки SharePoint у меня есть определенная группа пользователей, которая не имеет доступа к главной странице сайта. Если они посещают его напрямую, они получают стандартную страницу «Отказано в доступе» из SharePoint.

Я разрабатываю модуль HttpModule, который перехватывает посещение главной страницы, проверяет текущего пользователя и перенаправляет его на сайт, к которому у него есть доступ.

Сначала я попытался использовать PostAuthorizeRequest, но кажется, что SharePoint срабатывает при более раннем событии и все еще перенаправляет на страницу «Отказано в доступе». Я проверил с пользователем, который имел доступ к главной странице, но все еще был перенаправлен, и там перенаправление работает отлично.

Какое событие мне нужно записать, чтобы получить пользователя после того, как он ввел имя пользователя / пароль, но до того, как SharePoint перенаправит его?

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

Вместо того, чтобы отлавливать «неавторизованное» событие в вашем коде, я предлагаю вам использовать нестандартные ошибки. Когда пользователь перенаправляется на страницу «Отказано в доступе», SharePoint фактически выдает ошибку с кодом ошибки «401» (для неавторизованных).

В вашем файле web.config вы можете настроить поведение вашего приложения для ошибок 401. Если вы когда-либо создавали пользовательскую страницу с ошибкой в ​​веб-приложении, это то же самое. Найдите узел CustomError в вашем файле web.config и измените его следующим образом:

<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 работают таким образом. Использование конфигурации для всего сайта позволит вам запускать код только тогда, когда он должен быть запущен (то есть, когда доступ запрещен) вместо проверки разрешений при каждой загрузке страницы или что-то в этом роде.

0 голосов
/ 11 августа 2018

Используйте метод SPSecurity.SuppressAccessDeniedRedirectInScope, доступный в API, для предотвращения перенаправления SharePoint из коробки. Пример использования - оберните ваш код в этот фрагмент:

using (SPSecurity.SuppressAccessDeniedRedirectInScope scope = new SPSecurity.SuppressAccessDeniedRedirectInScope()) {
try{
catch (UnauthorizedAccessException ex){
}
}
0 голосов
/ 18 июня 2014

Как и в SharePoint 2013, у нас есть ошибка для настройки пользовательской страницы отказа в доступе, здесь объясняется, как реализовать использование HTTPModule.

Создание шага HTTPModule - объяснение с помощью страницы CustomAccessDenied в SharePoint 2013

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...