У меня есть веб-приложение ASP .NET Core, и когда я создал проект, проверка подлинности была настроена автоматически с использованием параметра учетных записей отдельных пользователей. Таблицы базы данных для учетных записей / ролей пользователей также были созданы автоматически.
Я создал свой собственный класс ApplicationUser, который наследуется от IdentityUser, и добавил параметры для FirstName, LastName и LockoutReason. (Я также добавил эти поля в таблицу БД). Теперь я пытаюсь добавить функцию, позволяющую кому-либо вручную заблокировать пользователя, и мне кажется, что я не могу обновить поле LockoutEnabled в базе данных. Каждый раз, когда я это делаю, он автоматически сбрасывается на false.
И код GET / POST для него:
//GET Users lock
public async Task<IActionResult> Lock(string id)
{
if (id == null)
{
return NotFound();
}
var userFromDb = await _db.ApplicationUser.SingleOrDefaultAsync(m => m.Id == id);
if (userFromDb == null)
{
return NotFound();
}
else
{
return View(userFromDb);
}
}
//POST Users lock
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Lock(string Id, ApplicationUser model)
{
var userFromDb = await _db.Users.Where(u => u.Id == Id).FirstOrDefaultAsync();
userFromDb.LockoutEnd = model.LockoutEnd;
userFromDb.LockoutEnabled = true;
userFromDb.AccessFailedCount = model.AccessFailedCount;
userFromDb.LockoutReason = model.LockoutReason;
_db.ApplicationUser.Update(userFromDb);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ApplicationUser.cs
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string LockoutReason { get; set; }
}
Когда я нажимаю кнопку «Заблокировать», поля LockoutEnd и LockoutReason обновляются правильно, но поле LockoutEnabled остается ложным, и учетная запись не блокируется.
Новый метод POST после попытки реализовать решение:
//POST Users lock
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Lock(string Id, ApplicationUser model)
{
var userFromDb = await _db.Users.Where(u => u.Id == Id).FirstOrDefaultAsync();
userFromDb.LockoutEnd = model.LockoutEnd;
userFromDb.AccessFailedCount = model.AccessFailedCount;
userFromDb.LockoutReason = model.LockoutReason;
_db.ApplicationUser.Update(userFromDb);
await _db.SaveChangesAsync();
var user2 = await _userManager.FindByIdAsync(userFromDb.Id);
var result = await _userManager.SetLockoutEnabledAsync(user2, true);
return RedirectToAction(nameof(Index));
}