4

我发现了一篇 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 控制器中完成身份验证步骤。或者也许“验证”和“获取状态”相关的应用程序事件将“延迟”并且在我的控制器执行其验证代码之前不会被引发?

是的?不?

4

1 回答 1

1

这里发生了两种不同的事情,这是可以理解的混乱。

  1. 正如您所了解的,Forms Authentication 模块确实运行得非常早。但是该模块主要是关于查看表单 auth cookie 并确定其真实性,如果它是真实的,那么设置正确的身份主体以供 ASP.NET 使用。
  2. 您通常在 MVC 项目中看到的身份验证代码是关于登录用户的,如果凭据正确,它会将表单身份验证的 cookie 设置为稍后处理。
于 2012-12-15T17:13:26.467 回答