无法使用 ASP .NET Core 更新 SQL 位列
Can't update SQL Bit column with ASP .NET Core
我有一个 ASP .NET Core 网络应用程序,当我创建项目时,身份验证是使用个人用户帐户选项自动设置的。用户 accounts/roles 的数据库 table 也是自动创建的。
我创建了自己的 ApplicationUser class,它继承自 IdentityUser,并为 FirstName、LastName 和 LockoutReason 添加了参数。 (我也将这些字段添加到数据库 table)现在我正在尝试添加一项功能以允许某人手动锁定用户,但我似乎无法更新数据库中的 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 字段仍然为 false,帐户未被锁定。
尝试实施解决方案后的新 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));
}
您无法通过更改 LockoutEnabled
属性.
来实现此目的
相反,您需要添加自定义 属性 例如 IsEnabled
注册操作修改应用程序用户
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, IsEnabled = true };
在 PasswordSigninAsync 上添加 IsEnabled 检查
'
if (user.IsEnabled)
return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);
return Task.FromResult<SignInStatus>(SignInStatus.LockedOut);
UserManager<ApplicationUser> _userManager
_userManager = userManager; //DI'd via CTOR for the class
用户 table.
使用 table 直接访问永远不会完成
在您的情况下,您可能需要通过调用来吸引用户
var user = await _userManager.FindByIdAsync(model.Id)
因为在模型变量中填充的 post 传递可能没有足够的信息。
//used from with in method
//model.LockoutEnabled will be either true or false depending on your selection
//from the view.
var result = await _userManager.SetLockoutEnabledAsync(user, model.LockoutEnabled);
这个returns IdentityResult
里面有Errors collection或者bool Succeeded属性,可以随意处理
你需要结合LockoutEnabled
和LockoutEnd
这两个属性。
LockoutEnabled
是一个指标,用于查看用户是否可以被锁定,LockoutEnd
是一个 DateTimeOffset。因此,为了锁定用户,将锁定设置为 true 并将 LockoutEnd
的值放在将来,因为过去的值表示用户未被锁定。
我有一个 ASP .NET Core 网络应用程序,当我创建项目时,身份验证是使用个人用户帐户选项自动设置的。用户 accounts/roles 的数据库 table 也是自动创建的。
我创建了自己的 ApplicationUser class,它继承自 IdentityUser,并为 FirstName、LastName 和 LockoutReason 添加了参数。 (我也将这些字段添加到数据库 table)现在我正在尝试添加一项功能以允许某人手动锁定用户,但我似乎无法更新数据库中的 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 字段仍然为 false,帐户未被锁定。
尝试实施解决方案后的新 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));
}
您无法通过更改 LockoutEnabled
属性.
相反,您需要添加自定义 属性 例如 IsEnabled
注册操作修改应用程序用户
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, IsEnabled = true };
在 PasswordSigninAsync 上添加 IsEnabled 检查
'
if (user.IsEnabled)
return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);
return Task.FromResult<SignInStatus>(SignInStatus.LockedOut);
UserManager<ApplicationUser> _userManager
_userManager = userManager; //DI'd via CTOR for the class
用户 table.
使用 table 直接访问永远不会完成在您的情况下,您可能需要通过调用来吸引用户
var user = await _userManager.FindByIdAsync(model.Id)
因为在模型变量中填充的 post 传递可能没有足够的信息。
//used from with in method
//model.LockoutEnabled will be either true or false depending on your selection
//from the view.
var result = await _userManager.SetLockoutEnabledAsync(user, model.LockoutEnabled);
这个returns IdentityResult
里面有Errors collection或者bool Succeeded属性,可以随意处理
你需要结合LockoutEnabled
和LockoutEnd
这两个属性。
LockoutEnabled
是一个指标,用于查看用户是否可以被锁定,LockoutEnd
是一个 DateTimeOffset。因此,为了锁定用户,将锁定设置为 true 并将 LockoutEnd
的值放在将来,因为过去的值表示用户未被锁定。