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