Asp.net
Identity 3 SignInManager.PasswordSignInAsync() 不返回任何結果
我正在使用 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()**不支持此參數,要檢查它,您必須使用另一個顯式方法