无法使用ASP .NET Core更新SQL位列

时间:2018-12-20 18:43:01

标签: c# asp.net-core asp.net-core-mvc entity-framework-core asp.net-core-2.2

我有一个ASP .NET Core Web应用程序,当我创建项目时,将使用单个用户帐户选项自动设置身份验证。用户帐户/角色的数据库表也已自动创建。

我创建了自己的ApplicationUser类,该类继承自IdentityUser,并添加了FirstName,LastName和LockoutReason的参数。 (我也将这些字段添加到了数据库表中)现在,我试图添加一项功能以允许某人手动锁定用户,而我似乎无法更新数据库中的LockoutEnabled字段。每次执行此操作时,它都会自动重置为false。

这是表格的图片: enter image description here

以及它的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));           
    }

3 个答案:

答案 0 :(得分:2)

您无法通过更改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);

答案 1 :(得分:2)

UserManager<ApplicationUser> _userManager

_userManager = userManager; //DI'd via CTOR for the class

从用户表中直接访问该表永远不会完成。

在您的情况下,您可能需要通过调用来吸引用户 var user = await _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,该错误具有Errors集合或bool Succeeded属性,可以根据需要进行处理。

答案 2 :(得分:2)

您需要LockoutEnabledLockoutEnd这两个属性的组合。

LockoutEnabled是一个指示器,用于查看用户是否可以被锁定,而LockoutEnd是DateTimeOffset。因此,为了锁定用户,请将锁定设置为true并在以后放置LockoutEnd的值,因为过去的值表示用户未锁定。