我发现了一篇 MSDN 文章,这可能是我所见过的关于IIS 集成管道的顺序和工作方式最有帮助的文章。但它提出了有关身份验证的有趣问题。
表单身份验证在管道的早期显示为“正在执行”。“执行”处理程序,例如用于 ASP.NET MVC 路由和控制器执行的处理程序,稍后会显示。但是 ASP.NET MVC 的身份验证故事通常是这样的:
public ViewResult Login(LoginModel login)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(...)){
FormsAuthentication.SetAuthCookie(...);
}
}
//...
}
上面的代码表明(表单)身份验证发生在“执行”处理程序阶段,而不是更早的“身份验证”IIS 阶段。
有人可以澄清这种表面上的差异吗?
我自己对此的猜测是,如果我没有配置成员资格提供程序,则 IIS“身份验证”阶段将在指示时执行 FormsAuthenticate.Authorize(...)。但是,如果我配置自己的成员资格提供程序,那么 IIS “身份验证”阶段实际上什么都不做 - 并等待“执行”阶段,以便我自己的身份验证代码可以执行。
如果我的猜测是正确的,那么如果我配置了我自己的成员资格提供程序,这意味着“获取状态”IIS 阶段也不会按预期运行:它还不会“看到”会话建立,因为会话不会建立直到我在 MVC 控制器中完成身份验证步骤。或者也许“验证”和“获取状态”相关的应用程序事件将“延迟”并且在我的控制器执行其验证代码之前不会被引发?
是的?不?