在我使用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*/
}
我的具体问题是关于锁定标志的复选框,这是我添加的自定义属性。对于测试用户,我手动将数据库中的标志设置为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
}
问题是,当我在编辑屏幕上的提交上单击Save时,userLockout参数出现为空。另外两个值被正确填充。如何访问userLockout值,以便在需要时继续将更改保存到数据库中?
最后,我在这里的最终目标是实现一个系统,管理员可以通过LockedOut标志锁定或解锁用户帐户(每次有人登录时都会检查该标志)。我知道Identity框架支持锁定,但这似乎只是受时间限制的锁定。在Identity框架中是否存在永久(除非手动更改)锁定的方法?我试图使用尽可能少的自定义代码和设计,所以这就是为什么我有兴趣知道这一点。特别是,我对使用框架跟踪不成功登录尝试计数的方式很感兴趣,因为我也想尽量避免手动实现。
谢谢。
在Edit方法中将userLockout类型更改为bool, post应该可以工作。
要在n次失败尝试后将用户锁定很长一段时间(永久锁定的子集),一种选择是将DefaultLockoutTimeSpan
设置为未来的x年。
检查用户是否被锁定,试试UserManager.IsLockedOutAsync(userId)