2

Ich erstelle Webanwendung mit Identity 3.0 und habe Probleme mit SignInManager PasswordSignInAsync() -Methode. Ich verwende es genau wie in der Dokumentation, aber es nicht zurück etwas (Anwendungscode nur dort stoppen) Hier `s mein Controller-Code:Identität 3 SignInManager.PasswordSignInAsync() gibt kein Ergebnis zurück

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

und Konfiguration in startup.cs Datei:

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

Danke für jede Hilfe

Antwort

7

die 'PasswordSignInAsync()' Methode kippt 'model.Email' als erstes Argument, es für den Benutzer überprüfen kann seine username.Here mit der Methode:

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



, wenn Sie die E-Mail durch die Überprüfung gehen möchten, können Sie die SignInAsync() Methode verwenden, aber das ist nach Prüfen, ob die CheckPasswordAsync() wahr ist hier ist das, was Sie vielleicht machen könnte:

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


Sie b Aber jetzt werde nicht e in der Lage, die LockoutOnFailure zu überprüfen, da die SignInAsync() dieses Argument nicht unterstützen, um es zu überprüfen, müssen Sie eine andere explizite Methode

machen
Verwandte Themen