2

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

一个选项在 BasePage 的 Page_PreInit 中,在 Global.asax 中的另一个 Application_AuthenticateRequest 和 Global.asax 中的另一个 FormsAuthentication_OnAuthenticate。

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

帕维尔

4

1 回答 1

0

我无法找到关于此问题的明确答案的链接,但从个人经验和阅读ASP.NET 应用程序生命周期来看,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 尚未设置,因此您必须手动检查有效票证以避免将表单身份验证票证添加到每个响应中。如果您的应用程序逻辑是票证只显示在第一个请求的正文中,那么您可能不需要这个额外的检查。

于 2012-10-17T19:10:13.143 回答