我正在尝试设置一个简单的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"]))
问题消失了。
答案 0 :(得分:0)
你的回发有可能有一个重复的表单数据变量,“票证”?这似乎可以解释我的行为。
除此之外,这条线是可疑的:
FormsAuthentication.Initialize();
FormsAuthentication类使用“Provider”模式,这意味着它是一个单例。你不应该重新初始化。 From the msdn documentation:
在FormsAuthenticationModule中调用Initialize方法 创建FormsAuthentication类的实例。这个方法是 不打算从你的代码中调用。