我添加了DateTime? LastLoggin屬性到我的AppUser類。我喜歡在用戶登錄時將該屬性設置爲DateTime.Now。使用登錄視圖登錄或通過cookie自動登錄時登錄。MVC - Asp.Net身份。 HOWTO在用戶登錄時登錄到數據庫
實際捕獲登錄的地方是什麼? 任何'最佳做法'將不勝感激。
我添加了DateTime? LastLoggin屬性到我的AppUser類。我喜歡在用戶登錄時將該屬性設置爲DateTime.Now。使用登錄視圖登錄或通過cookie自動登錄時登錄。MVC - Asp.Net身份。 HOWTO在用戶登錄時登錄到數據庫
實際捕獲登錄的地方是什麼? 任何'最佳做法'將不勝感激。
這取決於。如果您使用身份2.1,他們引入了一個名爲SignInManager的新類。這個類封裝了OWIN的AuthenticationManager類,這實際上是負責簽約用戶。在asp.net 2.1中,你會看到內SigninManager一些登錄方法,如
PasswordSignInAsync()
ExternalSignInAsync()
SignInAsync()和
TwoFactorSignInAsync()。
一旦用戶信息從數據庫中檢索和檢查完成,所有這些方法都將調用AuthenticationManager.Signin()來實際登錄用戶,這將是一個完美的地方,但是這是一個接口成員由OWIN設置,所以你將無法覆蓋它的Signin方法。所以捕捉用戶登錄的最佳位置就是我認爲的SigninManager.SigninAsync(...)
方法。這是因爲如果所述證書是有效的,並且用戶沒有小盒出等等等等,所有我上面如
hit SigninManager.SigninAsync(...)
。由於這種方法是虛擬的,你可以在你的SigninManager類中重寫,並通過調用UserManager.Update(),你會打的數據庫做這樣的事
public override async Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser)
{
await base.SignInAsync(user, isPersistent, rememberBrowser);
user.LastLogin= DateTime.Now;
UserManager.Update(user);
}
注意,但我不明白你怎麼能避免這一點。 asp.net身份識別方法喜歡打擊數據庫,除非你重寫他們的實現,你將不得不忍受。 (使用SigninManager.PasswordSignin()
,沒有任何自定義到基類根據我的SQL跟蹤命中數據庫4次)
如果您沒有使用asp.net標識2.1,SigninManager類不存在。 (MS有一個樣本nuget項目,它有一個類似的幫助類,但它不是框架的一部分)。您將需要在該助手類中找到該方法並覆蓋(或更改)登錄方法。
作爲最後一點,asp.net身份的文檔並不是非常完整的,我認爲這個源代碼還沒有公開。我使用JetBrains DotPeek
來查看Microsoft.AspNet.Identity.Owin
程序集和SigninManager
類中的代碼。我向你提到的流程(每種方法如何最終達到SigninAsync()
)都是我對DotPeek代碼的解釋。隨時驗證,並確保我沒有錯過任何東西。祝你好運。
很好的反饋!一個remarque UserManger。更新似乎不存在,但UpdateAsync會。最後一行成爲:await UserManager.UpdateAsync(user); – BrilBroeder 2014-12-06 09:18:06
非常感謝這個解決方案,它完美地爲我所需要做的事情工作! – Quiver 2016-04-19 17:36:49