Я изучаю возможности использования WIF для идентификации пользователей на частях сайта клиента, работающего на EPiServer. Мне удалось заставить WIF включиться, используя, среди прочего, следующий пост:
Это хорошо работает, если вы установите
<authorization>
<deny users="?"/>
</authorization>
в web.config для выполнения всех запросов требуется аутентифицированный пользователь. Однако мы хотели бы использовать EPiServer для разделения контента, который должен быть доступен анонимным пользователям и пользователям, прошедшим проверку подлинности. Проблема в том, что я просто не могу заставить его работать.
Когда я включаю WIF и не устанавливаю deny users="*"
, EPiServer срабатывает и выводит некоторый текст в поток ответов до того, как WIF будет включен для выполнения перенаправления:
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Tue, 01 Nov 2011 07:51:04 GMT
Connection: close
Access denied.
</pre></table></table></table></table></table></font></font></font></font></font></i></i></i></i></i></b></b></b></b></b></u></u></u></u></u><p> </p><hr>
Это приводит к следующей ошибке, когда WIF пытается перенаправить на STS:
Ошибка сервера в приложении '/'
Невозможно перенаправить после отправки заголовков HTTP.
Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Web.HttpException: невозможно перенаправить после отправки заголовков HTTP.
Ошибка источника:
Во время выполнения текущего веб-запроса возникло необработанное исключение. Информацию о происхождении и расположении исключения можно определить с помощью приведенной ниже трассировки стека исключений.
Трассировки стека:
[HttpException (0x80004005): Невозможно перенаправить после отправки HTTP-заголовков.] System.Web.HttpResponse.Redirect(String url, Boolean endResponse) +8712587
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.RedirectToIdentityProvider(String uniqueId, String returnUrl , логическое значение сохраняется) +249
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnEndRequest(отправитель объекта, аргументы EventArgs) +438
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 Система .Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое значение и выполнено синхронно) +75
Я искал как высокие, так и низкие, чтобы иметь возможность переопределить это поведение. В EPiServer.dll я нашел следующее место, которое выводит текст, аналогичный тому, что выводится:
AccessDeniedDelegateHandler.cs
, способ BrowserLogonAccessDenied(object sender)
:
internal static void BrowserLogonAccessDenied(object sender)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Status = "401 Unauthorized";
HttpContext.Current.Response.Write("Access denied.");
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
Насколько я вижу, этот код вызывается из следующих двух мест:
EPiServer.Global
, методprotected virtual void HandleAccessDenied()
EPiServer.PageBase
, методpublic virtual void AccessDenied()
Я пытался переопределить HandleAccessDenied
в Global.asax
и переопределить AccessDenied
в своем шаблоне страницы. Однако текст «Отказано в доступе» по-прежнему выводится. Похоже, что переопределение AcccessDenied
в моем шаблоне страницы срабатывает, однако переопределение HandleAccessDenied
, похоже, не срабатывает.
Любые намеки на то, что здесь может быть не так?