在我使用Identity框架的系统中,我在一个绑定到模型AppUser
的视图中有以下表单:
<div class="form-group">
<label>Name</label>
<p class="form-control-static">@Model.Id</p>
</div>
@using (Html.BeginForm("Edit", "Admin", new { returnUrl = Request.Url.AbsoluteUri }, FormMethod.Post, new { @id = "edituserform" }))
{
@Html.HiddenFor(x => x.Id)
<div class="form-group">
<label>Email</label>
@Html.TextBoxFor(x => x.Email, new { @class = "form-control" })
</div>
<div class="form-group">
<label>Password</label>
<input name="password" type="password" class="form-control" />
</div>
<input type="checkbox" name="userLockout" value="Account Locked" @(Html.Raw(Model.LockedOut ? "checked=\"checked\"" : "")) /> @:Account Locked <br>
<button type="submit" class="btn btn-primary">Save</button>
<button class="btn btn-default"
id="canceleditbutton">
Cancel
</button>
}
AppUser
的模型定义:
public class AppUser : IdentityUser
{
public bool LockedOut { get; set; }
/*Other fields not shown for brevity*/
}
我的具体问题是关于LockedOut标志的复选框,这是我添加的自定义属性。对于测试用户,我手动将数据库中的标志设置为True
,并且正如预期的那样,在视图上加载时选中了复选框。现在我的目标是能够在此表单调用提交的AdminController
的POST编辑方法中访问它。该方法的骨架如下:
[HttpPost]
public async Task<ActionResult> Edit(string id, string email, string password, string userLockout)
{
//Code here to change the LockedOut value in the database based on the input received
}
问题是当我在编辑屏幕上的提交上单击“保存”时,userLockout参数将显示为null。其他两个值正确填充。如何访问userLockout值,以便在需要时可以继续将更改保存到数据库中?
最后,我的最终目标是实现一个系统,管理员可以通过LockedOut标志锁定或解锁用户帐户(每次有人登录时都会检查)。我知道Identity框架支持锁定,但这似乎只是限时锁定。 Identity框架中是否存在永久(除非手动更改)锁定的方式?我试图尽可能少地使用自定义代码和设计,这就是为什么我也有兴趣知道这一点。特别是,我有兴趣使用框架跟踪不成功的登录尝试计数的方式,因为我想尽量避免手动实现。
谢谢。
答案 0 :(得分:1)
在Edit方法中将userLockout类型更改为bool,帖子应该可以正常工作。
要在n次失败尝试后锁定用户很长时间(永久锁定的子项),一个选项是将DefaultLockoutTimeSpan
设置为将来x年。
要检查用户是否已被锁定,请尝试UserManager.IsLockedOutAsync(userId)