Я выполнил действия с помощью отладчика и нашел эту строку в
AccountController var identityResult = await userManager.CreateAsync(user, registerViewModel.Password);
Я вижу, что имя пользователя, адрес электронной почты и пароль успешно введены. Но тогда на этой строчке
if (identityResult.Succeeded)
{
Я вижу, чтоidentResult не удалось. И внизу того же метода публикации регистрации в этой части
foreach (var error in identityResult.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
когда я оставляю это так, в верхней части страницы регистрации отображается сообщение об ошибке
Электронная почта '' недействителен
Я также пробовал так:
foreach (var error in identityResult.Errors)
{
// ....
ModelState.AddModelError(string.Empty, user.Email);
}
Когда я пытаюсь зарегистрировать пользователя таким образом, я получаю следующее сообщение вверху страницы регистрации: tim123@gmail.com
Поэтому мне кажется, что между этими двумя строками что-то не так:
var identityResult = await userManager.CreateAsync(user, registerViewModel.Password);
if (identityResult.Succeeded)
Вот мой контроллер учетной записи:
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using MovieOrganizer.Models.ViewModels;
using MovieOrganizer.Models.Domain;
namespace MovieOrganizer.Controllers
{
public class AccountController : Controller
{
private readonly UserManager userManager;
private readonly SignInManager signInManager;
public AccountController(UserManager userManager,
SignInManager signInManager)
{
this.userManager = userManager;
this.signInManager = signInManager;
}
[HttpGet]
public IActionResult Register()
{
return View();
}
[HttpPost]
public async Task Register(RegisterViewModel registerViewModel)
{
var user = new User
{
UserName = registerViewModel.UserName,
Email = registerViewModel.Email,
//PasswordHash = registerViewModel.Password
};
//var identityResult = await userManager.CreateAsync(user, registerViewModel.Password);
var identityResult = await userManager.CreateAsync(user, registerViewModel.Password);
if (identityResult.Succeeded)
{
var roleIdentityResult = await userManager.AddToRoleAsync(user, "User");
if (roleIdentityResult.Succeeded)
{
//return RedirectToAction("Register");
await signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Movies");
}
}
else
{
foreach (var error in identityResult.Errors)
{
ModelState.AddModelError(string.Empty, user.Email);
}
}
return View(registerViewModel);
}
[HttpGet]
public IActionResult Login()
{
var model = new LoginViewModel
{
};
return View(model);
}
[HttpPost]
public async Task Login(LoginViewModel loginViewModel)
{
if (!ModelState.IsValid)
{
return View(loginViewModel);
}
var user = await userManager.FindByNameAsync(loginViewModel.UserName);
if (user == null)
{
// User not found
ModelState.AddModelError(string.Empty, "Invalid username.");
return View(loginViewModel);
}
var signInResult = await signInManager.PasswordSignInAsync(loginViewModel.UserName,
loginViewModel.Password, false, false);
if (signInResult != null && signInResult.Succeeded)
{
//if (!string.IsNullOrWhiteSpace(loginViewModel.ReturnUrl))
//{
// return Redirect(loginViewModel.ReturnUrl);
//}
return RedirectToAction("Index", "Movies");
}
if (signInResult.IsLockedOut)
{
ModelState.AddModelError(string.Empty, "User account locked out.");
}
else if (signInResult.IsNotAllowed)
{
ModelState.AddModelError(string.Empty, "User account not allowed.");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid password.");
}
return View(loginViewModel);
}
[HttpGet]
public async Task Logout()
{
await signInManager.SignOutAsync();
return RedirectToAction("Index", "Home");
}
[HttpGet]
public IActionResult AccessDenied()
{
return View();
}
}
}
Вот моя RegisterViewModel:
using System.ComponentModel.DataAnnotations;
namespace MovieOrganizer.Models.ViewModels
{
public class RegisterViewModel
{
[Required]
public string UserName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[MinLength(6, ErrorMessage = "Password has to be at least 6 characters")]
public string Password { get; set; }
}
}
и вот мое представление Register.cshtml:
@model MovieOrganizer.Models.ViewModels.RegisterViewModel
Sign Up for Movie Library
@if (ViewData.ModelState.IsValid == false && ViewData.ModelState.ErrorCount > 0)
{
foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors))
{
@error.ErrorMessage
}
}
Register
Username
Password
Password Confirmation
Register
Log in with Google
Это мой файл Program.cs:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using MovieOrganizer.Data;
using MovieOrganizer.Models.Domain;
using MovieOrganizer.Repositories;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MovieOrganizerCon")));
builder.Services.AddIdentity(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
//builder.Services.AddIdentity()
// .AddEntityFrameworkStores();
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
builder.Services.AddScoped();
builder.Services.AddScoped();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var roleManager = scope.ServiceProvider.GetRequiredService();
var userManager = scope.ServiceProvider.GetRequiredService();
string[] roleNames = { "User" };
foreach(var roleName in roleNames)
{
var roleExist = await roleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
await roleManager.CreateAsync(new IdentityRole(roleName));
}
}
}
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Movies}/{action=Index}/{id?}");
app.Run();
Подробнее здесь: https://stackoverflow.com/questions/791 ... re-mvc-app