WebForms - 用于验证请求正文中传递的票证的事件?

时间:2012-10-16 20:56:16

标签: authentication webforms forms-authentication

这可能听起来很简单,但我找不到一个好的答案:当请求在请求正文中带有验证票时,哪个事件最适合验证请求(然后创建FormsAuthenticationTicket和auth)后续电话的cookie?)

一个选项是BasePage中的Page_PreInit,Global.asax中的另一个Application_AuthenticateRequest,以及Global.asax中的另一个FormsAuthentication_OnAuthenticate。

指向解决方案的任何链接都非常有用。

的Pawel

1 个答案:

答案 0 :(得分:0)

我无法找到关于此的明确答案的链接,但从个人经验和阅读ASP.NET Application Life Cycle看来,Application_BeginRequest似乎是最佳选择。我有一个应用程序在生产中使用此事件几年,用于您描述的场景(将特定于应用程序的票证转换为ASP.NET表单身份验证票证)。

使用Application_AuthenticateRequest和您提到的其他人的问题是,在同一请求周期中稍后控件使用您创建的表单身份验证cookie将为时已晚。

这是一个简单的例子。您需要填写自定义逻辑,以了解验证票证的方式。

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    if (!GetRequestHasValidTicket() )
    {
        string bodyToken = Request.Form["MyTokenName"];
        //custom logic to authenticate token
        bool tokenIsValid = true;
        if (tokenIsValid)
        {
            System.Web.Security.FormsAuthentication.SetAuthCookie("myusername", false);
        }
    }
}

private bool GetRequestHasValidTicket()
{
    FormsAuthenticationTicket ticket = null;
    try
    {
        ticket = System.Web.Security.FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
    }
    catch { }
    return ticket != null;
}

BeginRequest的一个小问题是Context.User尚未设置,因此您必须手动检查有效票证,以避免将表单身份验证票证添加到每个响应。如果您的应用程序逻辑使得故障单仅出现在第一个请求的正文中,那么您可能不需要这个额外的检查。