2017-08-20 20 views
2

依存性注入によってSignInManagerとAuthenticationManagerを使用しています。すべてここでSendTwoFactorCodeAsync以外SendTwoFactorCodeAsyncは、依存関係を持つSignManagerを使用して、成功したログイン後に「ユーザーIDが見つかりません」を返します。

を細かい作業がコードです:

UtilityConfig

container.RegisterType<ApplicationSignInManager>(); 
container.RegisterType<ApplicationUserManager>(); 

アカウント・コントローラ

var myUser = await UserManagerService.Value.FindAsync(model.Mobile, model.Password); 
if (myUser != null) 
    { 
     var result = await SignInManager.Value.PasswordSignInAsync(model.Mobile, model.Password, false, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       { 
        //success code 
       } 
      case SignInStatus.RequiresVerification: 
       { 
        var code = await UserManagerService.Value.GenerateTwoFactorTokenAsync(myUser.Id, ConfigurationManager.AppSettings["PhoneCodeProvider"]); 
        var send = await SignInManager.Value.SendTwoFactorCodeAsync(ConfigurationManager.AppSettings["PhoneCodeProvider"]); //here throughing exception 
        if (send) 
         { 
          SmsHelper.Value.SendSmsBySmsBatch(user.UserName, Constant.Instance().ProductName, myUser.UserName, "Code is " + code, true); 
          return RedirectToAction("TwoFactorCode", new { Provider = ConfigurationManager.AppSettings["PhoneCodeProvider"], ReturnUrl = returnUrl, RememberMe = false }); 
         }    
       } 
       break; 
       ---------------        
         } 

。また、これを試してみました

var userId = await SignInManager.Value.GetVerifiedUserIdAsync(); // this is returning 0 
    var user = await UserManagerService.Value.FindByIdAsync(userId); 
    if (user != null) 
    { 
     var code = await UserManagerService.Value.GenerateTwoFactorTokenAsync(myUser.Id, ConfigurationManager.AppSettings["PhoneCodeProvider"]); 
     var send = await SignInManager.Value.SendTwoFactorCodeAsync(ConfigurationManager.AppSettings["PhoneCodeProvider"]); //here throughing exception 
     if (send) 
      { 
       SmsHelper.Value.SendSmsBySmsBatch(user.UserName, Constant.Instance().ProductName, user.UserName, "Your security code is " + code, true); 
       return RedirectToAction("TwoFactorCode", new { Provider = ConfigurationManager.AppSettings["PhoneCodeProvider"], ReturnUrl = returnUrl, RememberMe = false }); 
      } 
    } 

奇妙なことが再び私がログアウトして...初めて取得問題は、第二それが動作しようとしてみてください。..最初の試みで、私はこの問題を取得し、第二に、それが正常に動作してみてください(完全にすべての結果を返す)ということです。私は正確に同じエラーを取得し、この

答えて

1

を解決するための最良の方法であることができるか

この失敗の理由を追跡することができません。私はSignInStatus.RequiresVerificationの場合を追加しようとしました:Thread.Sleep(500) それはちょうど遅延だったのかどうかを見てみましょう。

SendTwoFactorCodeAsyncがRequest.IsAuthernticatedかどうかを確認するためにリダイレクトが必要です。どのリクエストがありませんが、有効なログがであり

それはバグであり、ここでgithubの

+0

私はリダイレクトを試してみました..しかし、問題は.if URLをリフレッシュして(入力としてコードを取得するためにリダイレクトしたもの)..検証SMSを再送します...安全ではありません.. – NMathur

+0

https:// github。 com/aspnet/Identity/issues/1413 – NMathur

+0

はい、この方法では、パスワードによるログインのCookieを使用しているため、次のリクエストまでは機能しません。https://docs.microsoft.com/en-us/aspnet/アイデンティティ/概要/機能-API/2要素認証 - SMS-as-aspnet-identityを使用して、一般的にどのように使用されたのか –

0

に報告しなければならない私のコードは次のとおりです。

 [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     // This doesn't count login failures towards account lockout 
     // To enable password failures to trigger account lockout, change to shouldLockout: true 
     var result = await SignInManager.PasswordSignInAsync(model.Email.Trim(), model.Password.Trim(), model.RememberMe, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       var userId = await SignInManager.GetVerifiedUserIdAsync(); 
       if (userId == null) 
       { 
        return RedirectToAction("redirectSendTwoFactorCodeAsync", "Account", 
         new 
         { 
          ReturnUrl = returnUrl, 
          Email = model.Email, 
          Password = model.Password, 
          RememberMe = model.RememberMe 
         }); 
       } 

       if (!await SignInManager.SendTwoFactorCodeAsync(twoPartCode)) 
       { 
        ModelState.AddModelError("", "Failure sending Email verification token"); 
        return View(model); 
       } 
       return View("VerifyCode", new VerifyCodeViewModel { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
    } 

    [HttpGet] 
    [AllowAnonymous] 
    public async Task<ActionResult> redirectSendTwoFactorCodeAsync(string ReturnUrl, string Email, string Password, bool RememberMe) 
    { 
     if (!await SignInManager.SendTwoFactorCodeAsync(twoPartCode)) 
     { 
      ModelState.AddModelError("", "Failure sending Email verification token"); 
      return View("Login", new LoginViewModel() 
      { 
       Email = Email, 
       Password = Password, 
       RememberMe = RememberMe 
      }); 
     } 
     return View("VerifyCode", new VerifyCodeViewModel { ReturnUrl = ReturnUrl, RememberMe = RememberMe }); 
    } 
関連する問題