System.Web.HttpException с пользовательской настройкой BasicAuthentication HttpModule - PullRequest
2 голосов
/ 21 октября 2011

Я пытаюсь отладить исключение System.Web.HttpException, которое получаю. Это может быть связано с пользовательским HttpModule BaiscAuthentication, который я пытаюсь реализовать.

Модуль BasicAuthentication HttpModule подписывается на два события в конвейере: BeginRequest и AuthenticateRequest.

Весь код, который подписывается на событие BeginRequest, выполняется успешно. Но перед выполнением кода, подписанного на AuthenticateRequest, я получаю исключение System.Web.HttpException.

Исключение выглядит следующим образом

Exception Details: System.Web.HttpException: This server variable cannot be modified during request execution.

и трассировка стека выглядит следующим образом

[HttpException (0x80004005): This server variable cannot be modified during request execution.]
System.Web.HttpServerVarsCollection.SetServerVariableManagedOnly(String name, String value) +2423129
System.Web.HttpServerVarsCollection.SynchronizeServerVariable(String name, String value) +28
System.Web.HttpRequest.SynchronizeServerVariable(String name, String value) +112
System.Web.Hosting.IIS7WorkerRequest.GetServerVarChanges(HttpContext ctx) +372
System.Web.Hosting.IIS7WorkerRequest.SynchronizeVariables(HttpContext context) +8743312
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +154

Код работает на моем локальном компьютере, но не на хост-сервере.

UPDATE

Я нашел нарушающий код, но не понял, как исправить ошибку. Вот основной код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;


namespace CustomHttpModule
{    
public class CustomModule : IHttpModule 
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
        context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
    }

    public void context_BeginRequest(Object sender, EventArgs e)
    {
        HttpApplication context = (HttpApplication)sender;
        string authHeader = context.Context.Request.Headers["Authorization"];

            if (String.IsNullOrEmpty(authHeader))
            {
                SendAuthHeader(context);
            }

        context.Context.Response.Clear();
        context.Context.Response.Write("Have reached the end of BeginRequest");
        //context.Context.Response.End();   
    }

    private void SendAuthHeader(HttpApplication context)
    {
        context.Response.Clear();
        context.Response.StatusCode = 401;
        context.Response.StatusDescription = "Authorization Request";
        context.Response.AddHeader("WWW-Authenticate", "Basic realm=\"Secure Area\"");
        context.Response.Write("401 baby, please authenticate");
        context.Response.End();
    }

    public void context_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpApplication context = (HttpApplication)sender;

        context.Context.Response.Clear();
        context.Context.Response.Write("Have reached the Beginning of AuthenticateRequest");
        context.Context.Response.End();
    }

    public void Dispose()
    {
    }
}
}

Этот код выдает ошибку. Но если вы измените строку ..

string authHeader = context.Context.Request.Headers["Authorization"];

до

string authHeader = context.Context.Request.Headers["Host"];

тогда код также выполняется нормально.

Кажется, он обращается к Headers["Authorization"];, который вызывает ошибку.

Но если вы оставите Headers["Authorization"]; и раскомментируете строку //context.Context.Response.End();, тогда код также будет работать нормально.

Ошибка, по-видимому, возникает между концом BeginRequest и началом AuthenticateRequest. Но, похоже, связано с кодом Headers["Authorization"];

Я понятия не имею, почему это должно быть. Мне интересно, если это просто ошибка на сервере, так как код отлично работает на моей локальной машине.

1 Ответ

3 голосов
/ 21 октября 2011

Похоже, что ошибка вызвана изменением серверной переменной AUTH_USER, которая не разрешена интегрированным конвейером в iis7 и выше.

http://support.microsoft.com/kb/2605401/en-us?sd=rss&spid=14855

Эта ссылка дает подробности.

В нем говорится, что уведомления об аутентификации могут обрабатываться в управляемом модуле. Однако я до сих пор не знаю, как этого добиться. Но я собираюсь открыть новый вопрос по этой теме, так как этот вопрос становится довольно продолжительным и эффективно решается.

...