C# Can';t使用ASP.NET内核更新SQL位列
我有一个ASP.NET核心web应用程序,当我创建项目时,身份验证是使用“个人用户帐户”选项自动设置的。还自动创建了用户帐户/角色的数据库表 我创建了自己的ApplicationUser类,该类继承自IdentityUser,并为FirstName、LastName和LockoutReason添加了参数。(我也将这些字段添加到了DB表中)现在我尝试添加一个功能,允许用户手动锁定用户,但我似乎无法更新数据库中的LockoutEnabled字段。每次我这样做,它就会自动重置为false 以下是表格的图片: 以及它的获取/发布代码:C# Can';t使用ASP.NET内核更新SQL位列,c#,asp.net-core,asp.net-core-mvc,entity-framework-core,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,Asp.net Core 2.2,我有一个ASP.NET核心web应用程序,当我创建项目时,身份验证是使用“个人用户帐户”选项自动设置的。还自动创建了用户帐户/角色的数据库表 我创建了自己的ApplicationUser类,该类继承自IdentityUser,并为FirstName、LastName和LockoutReason添加了参数。(我也将这些字段添加到了DB表中)现在我尝试添加一个功能,允许用户手动锁定用户,但我似乎无法更新数据库中的LockoutEnabled字段。每次我这样做,它就会自动重置为false 以下是表格的
//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));
}
单击锁定按钮时,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));
}
//POST用户锁
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务锁(字符串Id,ApplicationUser模型)
{
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);
等待_db.SaveChangesAsync();
var user2=await\u userManager.FindByIdAsync(userFromDb.Id);
var result=await_userManager.SetLockoutEnabledAsync(user2,true);
返回重定向到操作(名称(索引));
}
您无法通过更改LockoutEnabled
属性来实现这一点
相反,您需要添加自定义属性,例如IsEnabled
- 关于注册操作修改应用程序用户
var user=newapplicationuser{UserName=model.Email,Email=model.Email,IsEnabled=true}代码>
- 在PasswordSigninAsync上添加IsEnabled检查
if(user.IsEnabled)
return base.PasswordSignInAsync(用户名、密码、记忆、shouldLockout);
返回Task.FromResult(SignInStatus.LockedOut);
UserManager\u UserManager
\u userManager=userManager//通过CTOR为该类分配数据
从用户表直接访问表是永远不会完成的
在您的情况下,您可能需要通过调用
var user=wait\u userManager.FindByIdAsync(model.Id)
因为您可能没有足够的关于模型变量中后期填充的传递的信息
//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);
这将返回
IdentityResult
,其中包含错误集合或bool successed属性,可以根据需要进行处理。您需要将这两个属性组合起来,即LockoutEnabled
和LockoutEnd
LockoutEnabled
是一个指示器,用于查看用户是否可以被锁定,而LockoutEnd
是一个日期时间偏移量。因此,为了锁定用户,请将锁定设置为true,并在将来输入值LockoutEnd
,因为过去的值表示用户未被锁定。尝试更新然后保存,参考()我只是试了一下,但它对我不起作用编辑:谢谢你的帮助,虽然不知道为什么,也许其他人可以帮助。你看过应用程序发送给db的查询了吗?字段是否包含在select和update语句中?这是一条评论中建议的,它对我不起作用。位字段(LockoutEnabled)是唯一一个不会更新的字段。感谢您的帮助-原来我只是误解了锁定的工作原理,但最终我可能会接受您的建议,创建自己的SignInManager和自定义锁定功能。您已经查看了@Hameed的帖子作为答案。它起作用了吗?将结果设置为该值是否会锁定用户,或者我是否需要对该变量执行某些操作?我试着调用wait_userManager.SetLockoutEnabledAsync(user,true),但没有成功。我还将user设置为wait_userManager.FindByIdAsync(userFromDb.Id),这样我就不需要更新LockoutEnabled了,我只是误解了帐户锁定的工作原理。不过我很感谢你的帮助!您是否将Startup.cs中的项目设置为Identity<代码>服务.Configure(配置=>{})哦,哇,我完全误解了上锁的工作原理。出于某种原因,我认为LockoutEnabled是一个指示器,用于查看用户当前是否被锁定,并将设置为1,直到LockoutEnd日期过去。我刚刚手动更新了LockoutEnabled值,现在我的锁定功能按预期工作。谢谢您还可以创建自己的锁定/禁用机制,方法是向用户添加适当的属性,例如:IsDisabled
,然后创建您自己的SignInManager
,它继承自SignInManager,您可以在其中覆盖PasswordSignInAsync
,以检查用户是否禁用。
if (user.IsEnabled)
return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);
return Task.FromResult<SignInStatus>(SignInStatus.LockedOut);
//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);