Nano Hash - криптовалюты, майнинг, программирование

EPiServer и Windows Identity Foundation (WIF)

Я изучаю возможности использования WIF для идентификации пользователей на частях сайта клиента, работающего на EPiServer. Мне удалось заставить WIF включиться, используя, среди прочего, следующий пост:

http://world.episerver.com/Blogs/Ben-Morris/Dates/2010/6/Converting-EPiServer-6-to-use-claims-based-authentication-with-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>&nbsp;</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, похоже, не срабатывает.

Любые намеки на то, что здесь может быть не так?


Ответы:


1

Нашел проблему. Я попытался переопределить метод AccessDenied метода PageBase, однако я сделал ту же «ошибку», что и реализация по умолчанию, а именно сбросил поток ответов:

    public override void AccessDenied()
    {
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        Response.Flush(); // <- This was the problem
        Response.End();
        // The rest is handled by WIF when we send a HTTP 401, think nothing more of it..
    }

Решение состояло в том, чтобы просто не сбрасывать поток ответов. Затем WIF обрабатывает все остальное:

    public override void AccessDenied()
    {
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        // Removed the flushing of the response
        Response.End();
        // The rest is handled by WIF when we send a HTTP 401, think nothing more of it..
    }

Это позволяет нам использовать авторизацию EPI для контроля того, какие пользователи имеют доступ к каждой странице.

02.11.2011

2

Вместо того, чтобы переопределять поведение AccessDenied, вы можете добавить специальную форму входа в систему (поскольку вы все еще полагаетесь на проверку подлинности с помощью форм), чтобы фактически инициировать вход в систему.

public class FederatedLoginHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.User.Identity.IsAuthenticated)
        {
            FormsAuthentication.RedirectFromLoginPage(context.User.Identity.Name, false);
        }
        else
        {
            context.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
        }
    }
}

Настройте обработчик в web.config с помощью

<system.webServer>
  <handlers>
    <!--"Fake" login handler, simply triggers WIF auth-->
    <add name="LoginForm" path="federatedlogin.ashx" verb="GET,HEAD" type="SomeAssembly.FederatedLoginHandler" />
    ...

И, наконец, настройте аутентификацию для использования нового обработчика.

<authentication mode="Forms">
  <forms name=".LoginPage" loginUrl="federatedlogin.ashx" timeout="120" />
</authentication>

Эта стратегия не требует изменения EPiServer, WIF или стандартного поведения ASP.Net. Конечно, вам нужна базовая конфигурация WIF, чтобы заставить это работать http://msdn.microsoft.com/en-us/library/gg638734.aspx.

09.11.2011
  • Я не полагаюсь на аутентификацию с помощью форм, но, возможно, это было бы хорошей идеей. Но единственная причина, по которой я должен переопределить функциональность EPiServer, заключается в том, что они очищают потоки ответов, если вы не используете аутентификацию форм. Я думаю, что правильным исправлением будет встроенная функция EPiServer, чтобы не сбрасывать поток ответов. Тогда WIF будет работать из коробки... 10.11.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..