我正在使用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" }
);
});
}
感谢您的帮助
答案 0 :(得分:7)
'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()不支持这个参数,要检查它你必须制作另一个显式方法
答案 1 :(得分:0)
random=1
答案 2 :(得分:0)
如果您正在使用为 ASP.NET Core 创建最新标识的 Blazor 实现
var user = await UserManager.FindByEmailAsync(_loginRequest.Email);
if (user != null && await UserManager.CheckPasswordAsync(user, _loginRequest.Password))
{
_showInvalidLoginMessage = false;
var token = await UserManager.GenerateUserTokenAsync(user, TokenOptions.DefaultProvider, "SignIn");
var data = $"{user.Id}|{token}";
var parsedQuery = System.Web.HttpUtility.ParseQueryString(new Uri(NavigationManager.Uri).Query);
var returnUrl = parsedQuery["returnUrl"];
if (!string.IsNullOrWhiteSpace(returnUrl))
{
data += $"|{returnUrl}";
}
var protector = DataProtectionProvider.CreateProtector("SignIn");
var pdata = protector.Protect(data);
NavigationManager.NavigateTo("/account/signinactual?t=" + pdata, forceLoad: true);
}
else
{
_showInvalidLoginMessage = true;
}
(您需要在项目上安装 Microsoft.AspNetCore.DataProtection