我正在使用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'TR
public virtual Task<SignInStatus> PasswordSignInAsync(
string userName,
string password,
bool isPersistent,
bool shouldLockout)
如果您想检查电子邮件,您可以使用SignInAsync()方法,但这是在检查CheckPasswordAsync是否为true之后以下是您可能制作的:
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()不支持此参数,要检查它,您必须制作另一个显式方法
var user = await userManager.FindByEmailAsync(model.Email);
var result = await signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, false);
如果您正在使用为ASP.NET Core 创建最新Identity的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
信用:https://github.com/christiansparre/BlazorAuthenticationSample/tree/master/src/BlazorAuthenticationSample.Client/Features/Account/Pages