2016-05-12 30 views
1

誰かがログインするたびにレコードを作成しようとしていますが、ログインポスト中にユーザーIDを取得する際に問題があります。標準的なログインPOSTがあります。サインインの成功の下で私のLoginSysActionを追加しました。しかし、私のユーザーIDはnullです。ここでasp.net mvcでユーザIDを取得するためのlogin loggingメソッドを置く場所は?

 var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       await LoginSysAction(); 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 

は私の伐採方法である:

private async Task LoginSysAction() 
    { 
     var addSysAction = new SysAction(); 
     addSysAction.Date = DateTime.UtcNow; 
     addSysAction.UserId = User.Identity.GetUserId(); 
     addSysAction.ActionType = "Login"; 
     db.SysActions.Add(addSysAction); 
     db.SaveChanges(); 
    } 

だから私の質問は基本的にある - 私には利用できないGetUserId()は、この点にありますか?もしそうでなければ、何か似たようなことを達成する最良の方法は何でしょうか?

+0

は 'Microsoft.AspNet.Identityを使用するため、あなたの名前空間を確認してください;' – Supersnake

+0

それはそこにあります。私はそれがユーザーIDがわかっているときと関係があると思うが、ログインプロセスのこの時点でそれがそこにあるように感じた。 –

答えて

0

GetUserId()は、このコントローラの動作中は使用できません。 GetUserNameも、他のアイデンティティメソッドもありません(私はそれらを試していませんが)。私は彼らが利用できなかったことにも驚いた!

ただし、UserManager.FindByEmailAsync()を使用してユーザーIDを検索すると、IdentityUserから継承したApplicationUserを返します。正常にログインするために使用されたばかりの電子メールを知っているので、ユーザーを調べてください。

case SignInStatus.Success: 
    var justLoggedIn = await UserManager.FindByEmailAsync(model.Email); 
    await LoginSysAction(justLoggedIn.Id); 
    return RedirectToLocal(returnUrl); 

明らかに、これに対応するためにはLoginSysActionを少し変更する必要があります。

DBコールを繰り返し実行するのは効率的ではありません。そのため、ログイン情報を格納している実際のデータベースクエリにユーザーIDの参照を組み込む価値があります。

ロギングを行う場所は、無効にすることができるSignInManager.PasswordSignInAsyncである可能性があります。

public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) 
{ 
    if (UserManager == null) 
     return SignInStatus.Failure; 

    var user = await UserManager.FindByNameAsync(userName); 
    if (user == null) 
     return SignInStatus.Failure; 

    if (await UserManager.IsLockedOutAsync(user.Id)) 
     return SignInStatus.LockedOut; 

    if (await UserManager.CheckPasswordAsync(user, password)) 
    { 
     await UserManager.ResetAccessFailedCountAsync(user.Id); 
     await SignInAsync(user, isPersistent, false); 
     // put your logging here! 
     await LoginSysAction(user.Id); 
     return SignInStatus.Success; 
    } 

    if (shouldLockout) 
    { 
     await UserManager.AccessFailedAsync(user.Id); 
     if (await UserManager.IsLockedOutAsync(user.Id)) 
      return SignInStatus.LockedOut; 
    } 

    return SignInStatus.Failure; 
} 
関連する問題