HttpModule打破了PostBack事件

时间:2011-08-25 20:51:35

标签: asp.net authentication forms-authentication httpmodule

我正在尝试设置一个简单的HttpModule来处理我的单点登录服务器之间的身份验证。我已经为下面的模块提供了代码。该模块正在进行我的SSO并正确地进行身份验证;但是,在具有表单的页面上,回发事件未正确发生(例如,即使发生了POST,isPostBack值也始终为false,按钮点击事件也不会被命中等等。)

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);
        }
    }
}

修改

我还要注意,如果我更改了这一行:

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

为:

if (!string.IsNullOrEmpty(request.QueryString["ticket"]))
问题消失了。

1 个答案:

答案 0 :(得分:0)

你的回发有可能有一个重复的表单数据变量,“票证”?这似乎可以解释我的行为。

除此之外,这条线是可疑的:

FormsAuthentication.Initialize();

FormsAuthentication类使用“Provider”模式,这意味着它是一个单例。你不应该重新初始化。 From the msdn documentation:

  

在FormsAuthenticationModule中调用Initialize方法   创建FormsAuthentication类的实例。这个方法是   不打算从你的代码中调用。