HttpModule прерывает события PostBack - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь настроить простой HttpModule для обработки аутентификации между моим сервером единого входа. Я включил код для модуля ниже. Модуль запускает мой SSO и правильно аутентифицируется; однако на страницах с формами события обратной передачи не происходят должным образом (например, значение isPostBack всегда ложно, даже несмотря на то, что произошел POST, события нажатия кнопки не получаются, и т. д.).

public sealed class MyAuthenticationModule : IHttpModule
{      
    public void Init(HttpApplication context)
    {
        context.AuthenticateRequest += OnAuthenticateRequest;
    }
    public void Dispose()
    {
    }

    public static void OnAuthenticateRequest(object sender, EventArgs e)
    {
        FormsAuthentication.Initialize();

        HttpContext context = HttpContext.Current;
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;

        // Validate the ticket coming back from the authentication server
        if (!string.IsNullOrEmpty(request["ticket"]))
        {
            // I can include code for this if you want, but it appears to be
            // working correct as whenever I get a ticket from my SSO it is processed
            // correctly. I only get a ticket after coming from the SSO server and
            // then it is removed from the URL so this only gets hit once.
            MyAuthentication.ProcessTicketValidation();
        }

        if (!request.IsAuthenticated)
        {
            // redirect to the login server
            response.Redirect("https://sso.example.com/login.aspx" + "?" + "service=" + 
                                HttpUtility.UrlEncode(context.Request.Url.AbsoluteUri), false);
        }
    }
}

EDIT

Я также хотел бы отметить, что если я изменю строку:

if (!string.IsNullOrEmpty(request["ticket"]))

до:

if (!string.IsNullOrEmpty(request.QueryString["ticket"]))

проблема исчезнет.

1 Ответ

0 голосов
/ 26 августа 2011

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

Кроме этого, эта строка вызывает подозрения:

FormsAuthentication.Initialize ();

Класс FormsAuthentication использует «Provider»шаблон, который означает, что это синглтон.Вы не должны повторно инициализировать. Из документации msdn:

Метод Initialize вызывается, когда FormsAuthenticationModule создает экземпляр класса FormsAuthentication.Этот метод не предназначен для вызова из вашего кода.

...