[英]Add role to user while login from external Provider like Google in asp.net identity
[英]How to save user last login date if he was logged in with external login provider using ASP .Net Identity?
我已經使用LastLoginDate
屬性擴展了AspNetUser
類, LastLoginDate
在用戶每次登錄時記住。
public sealed partial class User : IdentityUser<int, UserLogin, UserRole, UserClaim>, IUser<int>, IDatabaseEntity
{
...
public DateTime? LastLoginDate { get; set; }
}
每次用戶使用電子郵件和密碼作為登錄憑據進行常規登錄時,日志記錄工作正常。 在AccountController
我有我的登錄操作:
[HttpPost]
public ActionResult Login(LoginModel model)
{
...
var result = SignInManager.PasswordSignIn(model.Email, model.Password, model.RememberMe);
if (result == SignInStatus.Success)
{
var user = UserManager.FindByEmail(email);
UserManager.RememberLoginDate(user);
return Redirect(model.ReturnUrl);
}
...
}
RememberLoginDate
只是一個擴展方法,它基本上只是將當前時間設置為用戶LastLoginDate
屬性:
public static IdentityResult RememberLoginDate(this ApplicationUserManager manager, User user)
{
user.LastLoginDate = DateTime.UtcNow;;
return manager.Update(user);
}
但是當我像下面這樣進行外部登錄時:
[AllowAnonymous]
public ActionResult ExternalLoginCallback(string returnUrl, string provider)
{
var loginInfo = AuthenticationManager.GetExternalLoginInfo();
if (loginInfo == null)
return RedirectToAction("ExternalLoginFail");
// Sign in the user with this external login provider if the user already has a login
var result = SignInManager.ExternalSignIn(loginInfo);
if (result == SignInStatus.Success)
return RedirectToLocal(returnUrl);
if (result == SignInStatus.Failure)
{
return View("ExternalLoginConfirmation" ...)
}
...
}
在這種情況下如何記錄用戶登錄日期? 我現在沒有關於用戶的信息,例如email
或Id
來讓他使用UserManager
。 我已經嘗試過: User.Identity.GetUserId<int>()
在SignInManager.ExternalSignIn(loginInfo)
之后獲取用戶Id
但它在登錄后沒有更新,它仍然是default(int)
- 0
。 SignInStatus
只是一個enum
,沒有關於登錄用戶的附加信息,並且使用ExternalLoginInfo.Email
也不是一個選項,因為該電子郵件可能與用戶實際注冊的電子郵件不同。
您應該能夠使用UserManager.FindAsync(loginInfo.Login)
通過提供程序和密鑰拉回您的用戶 - 這就是 SignInManager 本身的工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.