0

正如我正在研究的那样Form Authentication in Asp.Net MVC,我想知道 - global.asaxOR 中是否有任何可用的事件,base controller class在表单身份验证发生时仅调用一次。(我只想在会话中添加一次并且仅在发生表单身份验证时添加)

我尝试了OnAuthorization 课堂活动AuthorizeCoreAuthorizeAttribute甚至我也尝试过文件Application_OnAuthenticateRequestApplication_AuthorizeRequest事件Global.asax..

但问题是,所有这些事件都会在每个请求上触发,我只想在authentication发生时执行一次。

您能否建议我这样做的最佳方法是什么!?

注意:身份验证 cookie 由存在于同一域中的另一个 Asp.net MVC 应用程序设置。(而且我正在通过 submain 访问这个应用程序 - 所以我可以访问父应用程序的 auth cookie)。但是,当应用程序 1 发生身份验证时,我想在应用程序 2 中设置一些会话变量。(因为我的应用程序 2 用户现在已经过身份验证,我想在应用程序 2 的会话中添加一些信息)

提前致谢!

4

4 回答 4

2

当应用程序 1 中发生身份验证时,添加一个额外的 cookie,该 cookie 将触发在应用程序 2 中设置会话变量。在应用程序 2 中的AuthorizeCore覆盖中AuthorizeAttribute,检查 cookie 的存在。如果存在,请设置会话变量并将其删除。

您也可以考虑将信息添加到 的用户数据部分,FormsAuthenticationTicket而不是将其存储在会话中。

于 2012-12-12T14:54:53.020 回答
1

您要问的是一个特定于应用程序的事件,并且由于不能简单地定义它的要求和细节,因此没有内置事件来处理它。因此,您必须自己创建它。

由于您使用的是 Forms Auth,因此您确切地知道它们进行了身份验证,但我怀疑您对一种以松散耦合、事件驱动的方式将其与其他模块或组件进行通信的方式感兴趣。我建议您在业务层中定义一个服务接口来代表您的身份验证服务。然后,您可以让需要通知(或被通知)身份验证事件的各种组件直接与身份验证服务对话,而不是尝试通过 ASP.NET 推送。我的回答相当含糊,因为您提供的有关在该事件中需要做什么的信息并不明显。

无论如何,我们可以考虑如何通过 ASP.NET 来推动它。为您的应用程序生成的由 Global.asax.cs 表示的类与任何类一样。您可以想象将自己的事件添加到该类中,并且IHttpModule(例如)希望订阅它,只需将方法中的HttpApplication context参数Init转换为特定类型并像往常一样附加事件。

于 2012-12-12T13:55:18.747 回答
0

正如您所发现的,身份验证会在每个请求上执行,以验证是否允许给定用户查看给定页面。但是,您将需要在某处定义一个函数,该函数调用.SetAuthCookie()以在登录时(通常)对用户进行身份验证。您应该在此函数中调用您的操作。

于 2012-12-12T13:41:55.333 回答
0

据我所知,没有 OnAuthorized 事件。也许在 ASP.NET Forms 中有,但在 MVC 中,事情更加手动且更加灵活。

如果您在默认的 ASP.NET MVC Internet 应用程序项目中,则AccountController在 \Controllers\ 文件夹中打开并找到Login方法:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
    {
        // Add session data or trigger an event
        return RedirectToLocal(returnUrl);
    }

您应该找到与上述类似的内容。您可以在此处添加额外的会话数据或您希望在用户登录时执行的任何其他一次性代码。

即使您不使用 ASP.NET MVC Internet 应用程序,同样的概念也适用。在某些时候,您将需要一个控制器来处理登录 POST。成功登录后,您将执行代码。

于 2012-12-12T14:01:23.410 回答