这可能听起来很简单,但我找不到一个好的答案:当请求在请求正文中带有验证票时,哪个事件最适合验证请求(然后创建FormsAuthenticationTicket和auth)后续电话的cookie?)
一个选项是BasePage中的Page_PreInit,Global.asax中的另一个Application_AuthenticateRequest,以及Global.asax中的另一个FormsAuthentication_OnAuthenticate。
指向解决方案的任何链接都非常有用。
的Pawel
答案 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尚未设置,因此您必须手动检查有效票证,以避免将表单身份验证票证添加到每个响应。如果您的应用程序逻辑使得故障单仅出现在第一个请求的正文中,那么您可能不需要这个额外的检查。