Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单身份验证-需要在表单身份验证发生后仅执行一次的事件_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Authentication - Fatal编程技术网

C# 表单身份验证-需要在表单身份验证发生后仅执行一次的事件

C# 表单身份验证-需要在表单身份验证发生后仅执行一次的事件,c#,asp.net,asp.net-mvc,asp.net-mvc-3,authentication,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Authentication,由于我正在Asp.NETMVC中进行表单身份验证,我想知道这一点- global.asax或基本控制器类中是否有任何事件可用,当表单身份验证发生时只调用一次。(我只想在会话中添加一次,并且仅在表单身份验证发生时添加) 我尝试了OnAuthorization和AuthorizeCore类的AuthorizeAttribute事件。 甚至我也尝试了Application\u OnAuthenticateRequest和Application\u AuthorizeRequest事件的Global.a

由于我正在Asp.NETMVC中进行
表单身份验证
,我想知道这一点-
global.asax
基本控制器类
中是否有任何事件可用,当表单身份验证发生时只调用一次。(我只想在会话中添加一次,并且仅在表单身份验证发生时添加)

我尝试了
OnAuthorization
AuthorizeCore
类的
AuthorizeAttribute
事件。 甚至我也尝试了
Application\u OnAuthenticateRequest
Application\u AuthorizeRequest
事件的
Global.asax
文件

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

你能告诉我做这件事最好的方法是什么吗

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


提前谢谢

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

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

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

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


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

您所要求的是特定于应用程序的事件,由于不能简单地定义其需求和细节,因此没有处理此问题的内置事件。所以,你必须自己创造这个

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


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

据我所知,没有授权事件。在ASP.NET表单中可能有,但在MVC中,操作更加手动,更加灵活

如果您在默认的ASP.NET MVC Internet应用程序项目中,请打开\Controllers\文件夹中的
AccountController
,然后找到
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应用程序,同样的概念也适用。在某些时候,您需要一个控制器来处理登录帖子。成功登录时,您将执行代码。

据我所知,没有经过授权的事件。在ASP.NET表单中可能有,但在MVC中,操作更加手动,更加灵活

如果您在默认的ASP.NET MVC Internet应用程序项目中,请打开\Controllers\文件夹中的
AccountController
,然后找到
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);
    }
你应该找到与上面类似的东西。在这里,您可以添加额外的会话数据或任何其他数据