在ASP.net全球OnLoggedIn事件?(Global OnLoggedIn event in

2019-09-18 01:29发布

是否有当用户变得与ASP.net网站登录到被通知的方式?

:用户可以成为登录时没有参观“登录页面”。 如果“记住我” cookie存在,他们可以打任意页面和登录。

当用户登录我想要一些会话相关的信息。

:还有就是Login.LoggedIn事件。 问题是,控制不会在每一页上存在; 和一个页面就出现在( Login.aspx )不会调用OnLoggedIn事件。

以同样的方式, Global.asax具有全局会话开始通知:

void Session_Start(object sender, EventArgs e) 
{
}

我假设某处有记录在一个信息通报上的用户

void LoggedIn(object sender, EventArgs e)
{
}

奖金阅读

  • OnLoggedIn在登录页ASP.NET事件
  • 在登录时运行自定义代码
  • MDSN Logon.OnLoggedIn事件
  • 如何更新上次登录日期,如果“记住我”设置?

Answer 1:

我想你没有一个独特的地方这样做。 在我的情况(MVC + log4net的),我用这个:

  • Global.asax我检查验证的用户与现有的预饼干。

     protected void Session_Start() { string ip = HttpContext.Current.Request.UserHostAddress; log.InfoFormat("Starting session: {0} from {1}.",Session.SessionID, ip); if ((HttpContext.Current != null) && (HttpContext.Current.User != null) && (HttpContext.Current.User.Identity.IsAuthenticated) ) { string user = HttpContext.Current.User.Identity.Name; string type = "Cookie"; log.InfoFormat("User {0} logged in with {1}.", user, type); } } 
  • 我的账号控制器我检查本地登录(我使用的互联网应用模板从MVC4,但你可以在你做这个Login.OnLoggedIn如果您正在使用Web表单)

     [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginModel model, string returnUrl) { if (ModelState.IsValid && WebSecurity.Login(model.EMail, model.Password, persistCookie: model.RememberMe)) { string user = model.EMail; string type = "Forms"; log.InfoFormat("User {0} logged in with {1}.", user, type); return RedirectToLocal(returnUrl); } // If we got this far, something failed, redisplay form ModelState.AddModelError("", "The user name or password provided is incorrect."); log.ErrorFormat("Bad password or user name. User={0}", model.EMail, model.Password); return View(model); } 
  • 但是,我需要检查的OAuth登录过,就像这样:

     [AllowAnonymous] public ActionResult ExternalLoginCallback(string returnUrl) { AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl })); if (!result.IsSuccessful) { log.Debug("External login failure."); return RedirectToAction("ExternalLoginFailure"); } if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false)) { log.InfoFormat("User {0} logged in with External {1} login. External UserID = {2}", Membership.GetUser(OAuthWebSecurity.GetUserName(result.Provider, result.ProviderUserId)).UserName, result.Provider, result.ProviderUserId); return RedirectToLocal(returnUrl); } ... } 


Answer 2:

您可以在支票上Application_AuthenticateRequest在Global.asax的,就是你可以检查是否请求与您的会话数据记录或不在一起,如果像你说的会话数据需要初始化决定的地方。

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    //  check for logged in or not
    if (null != authCookie)
    {
        // is logged in... check if the session needs init

    }   
}

或以相同的结果

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    //  check for logged in or not
    if(HttpContext.Current.User != null && 
        HttpContext.Current.User.Identity != null 
            && HttpContext.Current.User.Identity.IsAuthenticated)
    {
        // is logged in... check if the session needs init

    }   
}    


Answer 3:

:您可以拨打你的代码在这两个地方OnLoggedIn从事件Login控制,并在会话开始(使用Session_Start在Global.asax中的事件),因为这将是与用户数据的第一个请求。 在那里,你可以检查用户登录,如果是这样,你需要什么。



Answer 4:

虽然技术上被记录在相同被认证的,我对此有不同的心理模型。

在我的心目中以下三个东西是不同的问题:

  • 用户/获取会话
  • 用户通过验证
  • 用户登录

对我来说,这些手段的最后一句:“ 会话已经为用户创建,用户进行身份验证并经过验证的用户会话已初始化 ”。

利用该模型,用户可以成为登录时:

  • 用户登录在登录页面和现有的预会议是必要的用户数据初始化
  • 预认证的用户进入网站并创建一个新的会话初始化和他/她

同样,当他/她的初始化会话被破坏的用户成为注销。

采用这种模式意味着:

  • 您可以标识用户“登录时”无论是在Login.OnLoggedIn事件或Session_Start事件Global.asax 。 当然,会话启动事件触发也未经验证的用户,所以你需要验证用户身份验证的事件触发时。
  • 您可以在一定程度可靠地告诉当用户“注销”,或者明确的洛出来,或者当一个正确初始化会话在被destoyed Session_End在Global.asax中的事件。 我说有点可靠的,因为我觉得Session_End中的事件(S)不一定会被解雇时,应用程序池回收或崩溃死亡。 虽然我还没有测试,所以我可能是错的。
  • 用户可以是同时“记录在”多次。 至少在IE浏览器就可以开始从文件菜单“新建会话”。 这将启动其不与任何已有的IE窗口共享会话cookie一个新的IE浏览器。 这意味着一个新的会话将被服务器,当用户来到现场,并根据autentication机制使用这可能意味着他/她也必须再次进行身份验证创建。

它不会让你“ 列表中的所有当前登录的用户 ”开箱即用。 您将需要创建跟踪的那个自己,我认为的索姆方式。 这我或多或少难以做到的。 尤其是在情况下,当你的应用程序在某种负载平衡的环境中运行,让所有当前的用户列表可能会非常棘手。



文章来源: Global OnLoggedIn event in ASP.net?