是否有当用户变得与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事件
- 如何更新上次登录日期,如果“记住我”设置?
我想你没有一个独特的地方这样做。 在我的情况(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); } ... }
您可以在支票上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
}
}
:您可以拨打你的代码在这两个地方OnLoggedIn
从事件Login
控制,并在会话开始(使用Session_Start
在Global.asax中的事件),因为这将是与用户数据的第一个请求。 在那里,你可以检查用户登录,如果是这样,你需要什么。
虽然技术上被记录在相同被认证的,我对此有不同的心理模型。
在我的心目中以下三个东西是不同的问题:
对我来说,这些手段的最后一句:“ 会话已经为用户创建,用户进行身份验证并经过验证的用户会话已初始化 ”。
利用该模型,用户可以成为登录时:
- 用户登录在登录页面和现有的预会议是必要的用户数据初始化
- 预认证的用户进入网站并创建一个新的会话初始化和他/她
同样,当他/她的初始化会话被破坏的用户成为注销。
采用这种模式意味着:
- 您可以标识用户“登录时”无论是在
Login.OnLoggedIn
事件或Session_Start
事件Global.asax
。 当然,会话启动事件触发也未经验证的用户,所以你需要验证用户身份验证的事件触发时。 - 您可以在一定程度可靠地告诉当用户“注销”,或者明确的洛出来,或者当一个正确初始化会话在被destoyed
Session_End
在Global.asax中的事件。 我说有点可靠的,因为我觉得Session_End中的事件(S)不一定会被解雇时,应用程序池回收或崩溃死亡。 虽然我还没有测试,所以我可能是错的。 - 用户可以是同时“记录在”多次。 至少在IE浏览器就可以开始从文件菜单“新建会话”。 这将启动其不与任何已有的IE窗口共享会话cookie一个新的IE浏览器。 这意味着一个新的会话将被服务器,当用户来到现场,并根据autentication机制使用这可能意味着他/她也必须再次进行身份验证创建。
它不会让你“ 列表中的所有当前登录的用户 ”开箱即用。 您将需要创建跟踪的那个自己,我认为的索姆方式。 这我或多或少难以做到的。 尤其是在情况下,当你的应用程序在某种负载平衡的环境中运行,让所有当前的用户列表可能会非常棘手。