我添加了一个日期时间?我的 AppUser 类的 LastLoggin 属性。我喜欢在用户登录时将属性设置为 DateTime.Now。使用登录 View 登录或通过 cookie 自动登录时。
实际捕获登录的地方是什么?
任何“最佳实践”将不胜感激。
最佳答案
这取决于。如果您使用身份 2.1,他们引入了一个名为 SignInManager 的新类。该类包装了 OWIN AuthenticationManager 类,该类实际上负责用户登录。在 asp.net 2.1 中,您会在 SigninManager 中看到很少的登录方法,例如
一旦从数据库中检索到用户信息并进行检查,所有这些方法都会调用 AuthenticationManager.Signin() 来实际登录用户。这本来是一个完美的地方,但这是由 OWIN 设置的接口(interface)成员,所以您将无法覆盖其 Signin 方法。所以捕获用户登录的最佳位置是
SigninManager.SigninAsync(...)
。以我拙见的方法。这是因为如果凭据有效,并且用户没有被锁定等,我上面提到的所有方法,例如点击
SigninManager.SigninAsync(...)
.由于此方法是虚拟的,因此您可以在 SigninManager 类中覆盖并执行类似的操作public override async Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser)
{
await base.SignInAsync(user, isPersistent, rememberBrowser);
user.LastLogin= DateTime.Now;
UserManager.Update(user);
}
请注意,通过调用 UserManager.Update(),您将访问数据库,但我不知道如何避免这种情况。 asp.net 身份方法喜欢访问数据库,除非您覆盖它们的实现,否则您将不得不忍受它。 (根据我的 SQL 跟踪,使用
SigninManager.PasswordSignin()
没有对基类进行任何自定义会命中数据库 4 次)如果您没有使用 asp.net identity 2.1,则 SigninManager 类不存在。 (MS 有一个示例 nuget 项目,它有一个类似的帮助类,但它不是框架的一部分)。您将需要在该帮助程序类中找到该方法并覆盖(或更改)登录方法。
最后一点,在我看来,asp.net 身份的文档还不是很完整,源代码还没有公开。我用了
JetBrains DotPeek
查看 Microsoft.AspNet.Identity.Owin
中的代码装配和SigninManager
类(class)。我向您提到的流程(每种方法如何以某种方式最终到达 SigninAsync()
)是我对 DotPeek 代码的解释。随意验证并确保我没有错过任何东西。祝你好运。
关于asp.net-mvc - MVC - Asp.Net 身份。用户登录时如何登录到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27296595/