c# - SendTwoFactorCodeAsync 在成功登录后返回 'UserId not found',使用具有依赖性的 SignManager

标签 c# asp.net asp.net-mvc asp.net-identity

我正在通过依赖注入(inject)使用 SignInManager 和 AuthenticationManager。除 SendTwoFactorCodeAsync

外,一切正常

代码如下:

实用程序配置

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 });
          }
    }

奇怪的是,第一次尝试我遇到了这个问题,第二次尝试它工作正常(完美地返回所有结果)..我再次注销并尝试..第一次遇到问题第二次尝试它工作。

无法追踪此失败的原因,什么是解决此问题的最佳方法

最佳答案

我得到了完全相同的错误。我尝试添加案例 SignInStatus.RequiresVerification: Thread.Sleep(500) 看看是否只是延迟但无济于事。

它需要重定向,因为 SendTwoFactorCodeAsync 检查是否 Request.IsAuthernticated。请求不是,但有一个有效的登录。

这是一个错误,应该在github上报告

关于c# - SendTwoFactorCodeAsync 在成功登录后返回 'UserId not found',使用具有依赖性的 SignManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45779673/

相关文章:

c# - 如何启动具有管理员权限的应用程序

c# 为什么不能将开放的泛型类型作为参数传递?

c# - 无法解析 JSON 文件,Progam.cs asp.net core 中出错

jquery - 页面浏览量 - 浏览计数器

asp.net-mvc - 路由中第一个参数的默认值

c# - 使用 C# 代码在 asp.net 上搜索按钮

c# - 如何设置 datagridview 中行/列标题单元格的背景颜色 - c# winform

.net - 使用.net创建WSRP Portlet

.net - DataTable.Select ("Bla=' Blablabla '").Count Returns ' Count' 不是 'System.Array' 异常的成员

c# - 如何管理Crystal Report Dispose?