2

Я создаю веб-приложение с Identity 3.0 и имею проблемы с SignInManager PasswordSignInAsync(). Я использую его так же, как в документации, но она ничего не возвращает (код приложения просто останавливается) мой код Здесь `s контроллер:Identity 3 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" } 
       ); 
     }); 
    } 

Спасибо за любую помощь

ответ

7

'PasswordSignInAsync()' метод не могу принять 'model.Email' в качестве первого аргумента, может проверить для пользователя, используя его username.Here метод:

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


Но теперь вы не будете б e можно проверить lockoutOnFailure с SignInAsync() не поддерживает этот аргумент, чтобы проверить его, вам нужно сделать другой явный метод

Смежные вопросы