Asp.net

Identity 3 SignInManager.PasswordSignInAsync() 不返回任何結果

  • December 28, 2020

我正在使用 Identity 3.0 創建 Web 應用程序,但 SignInManager PasswordSignInAsync() 方法存在問題。我就像在文件中一樣使用它,但它不返回任何東西(應用程式碼就停在那裡)這是我的控制器程式碼:

public class AppController : Controller
{
   private IAccountService _service;
   private readonly SignInManager<User> _signInManager;
   private UserManager<User> _userManager;

   public AppController(IAccountService service, SignInManager<User> signInManager, UserManager<User> userManager)
   {
       _service = service;
       _signInManager = signInManager;
       _userManager = userManager;
   }

   [HttpPost]
   [AllowAnonymous]
   [ValidateAntiForgeryToken]
   public async Task<IActionResult> Login(LoginViewModel model)
   {
       if (ModelState.IsValid)
       {
           var user = await _userManager.FindByEmailAsync(model.Email);
           var password = await _userManager.CheckPasswordAsync(user, model.Password);

           var result = await _signInManager.PasswordSignInAsync(
               model.Email,
               model.Password,
               model.RememberMe,
               lockoutOnFailure: false);

           if (result.Succeeded)
           {
               return RedirectToAction(nameof(EmployeeController.Contact), "Employee");
           }
           if (result.IsLockedOut)
           {
               return View("Lockout");
           }
           if(result.IsNotAllowed)
           {
               return View("Not Allowed");
           }
           else
           {
               ModelState.AddModelError(string.Empty, "Invalid login attempt.");
               return View(model);
           }
       }
       return View(model);
   }
}

以及startup.cs文件中的配置:

public void ConfigureServices(IServiceCollection services)
   {
       services.AddMvc();
       services.AddCaching();
       services.AddSession(options => {
           options.IdleTimeout = TimeSpan.FromMinutes(30);
           options.CookieName = ".MyApplication";
       });

       services.AddEntityFramework()
       .AddSqlServer()
       .AddDbContext<ApplicationDbContext>(options =>
           options.UseSqlServer(Configuration["Data:DbContextConnection"]));


       services.AddIdentity<User, UserRole>(config => 
           {
               config.User.RequireUniqueEmail = true;
               config.Password.RequiredLength = 8;
               config.Cookies.ApplicationCookie.LoginPath = "/App/Login";
               config.SignIn.RequireConfirmedEmail = false;
               config.SignIn.RequireConfirmedPhoneNumber = false;
           })
       .AddEntityFrameworkStores<ApplicationDbContext,string>()
       .AddDefaultTokenProviders();

       services.AddTransient<IAccountService, AccountService>();
   }

public void Configure(IApplicationBuilder app)
   {
       app.UseStaticFiles();

       app.UseSession();

       app.UseIdentity();
       app.UseMvc(config =>
       {
           config.MapRoute(
               name: "Default",
               template: "{controller}/{action}/{id?}",
               defaults: new { controller = "App", action = "Index" }
               );
       });
   }

謝謝你的幫助

’ **PasswordSignInAsync()’方法不能以‘model.Email’**作為第一個參數,它可以使用他的使用者名檢查使用者。方法如下:

public virtual Task<SignInStatus> PasswordSignInAsync(
   string userName,
   string password,
   bool isPersistent,
   bool shouldLockout) 

如果您想檢查電子郵件,您可以使用**SignInAsync()方法,但這是在檢查CheckPasswordAsync()**是否為真之後,您可能會這樣做:

var user = await _userManager.FindByEmailAsync(model.Email);
var password = await _userManager.CheckPasswordAsync(user, model.Password);

if(password)
{
  var result = await _signInManager.SignInAsync(
                   model.Email,
                   model.Password,
                   model.RememberMe);
    if (result.Succeeded)
    {
         return RedirectToAction(nameof(EmployeeController.Contact), "Employee");
    }
}

但是現在您將無法檢查 lockoutOnFailure 因為**SignInAsync()**不支持此參數,要檢查它,您必須使用另一個顯式方法

引用自:https://stackoverflow.com/questions/36383768