Pau*_*ulJ 5 asp.net asp.net-mvc asp.net-identity asp.net-identity-3 asp.net-core
我正在使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
并在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" }
);
});
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
该"PasswordSignInAsync()"方法不能上场"model.Email"作为第一个参数,它可以检查了为使用他username.Here用户是方法:
public virtual Task<SignInStatus> PasswordSignInAsync(
string userName,
string password,
bool isPersistent,
bool shouldLockout)
Run Code Online (Sandbox Code Playgroud)
如果你想查看电子邮件,你可以使用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");
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在你无法检查lockoutOnFailure,因为SignInAsync()不支持这个参数,要检查它你必须制作另一个显式方法
| 归档时间: |
|
| 查看次数: |
10733 次 |
| 最近记录: |