2014-12-04 129 views

回答

11

這取決於。如果您使用身份2.1,他們引入了一個名爲SignInManager的新類。這個類封裝了OWIN的AuthenticationManager類,這實際上是負責簽約用戶。在asp.net 2.1中,你會看到內SigninManager一些登錄方法,如

  • PasswordSignInAsync()

  • ExternalSignInAsync()

  • SignInAsync()和

  • TwoFactorSignInAsync()。

一旦用戶信息從數據庫中檢索和檢查完成,所有這些方法都將調用AuthenticationManager.Signin()來實際登錄用戶,這將是一個完美的地方,但是這是一個接口成員由OWIN設置,所以你將無法覆蓋它的Signin方法。所以捕捉用戶登錄的最佳位置就是我認爲的SigninManager.SigninAsync(...)方法。這是因爲如果所述證書是有效的,並且用戶沒有小盒出等等等等,所有我上面如

  • PasswordSignInAsync()
  • ExternalSignInAsync()
  • TwoFactorSignInAsync()
  • 提到的方法

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代碼的解釋。隨時驗證,並確保我沒有錯過任何東西。祝你好運。

+3

很好的反饋!一個remarque UserManger。更新似乎不存在,但UpdateAsync會。最後一行成爲:await UserManager.UpdateAsync(user); – BrilBroeder 2014-12-06 09:18:06

+0

非常感謝這個解決方案,它完美地爲我所需要做的事情工作! – Quiver 2016-04-19 17:36:49