我正在使用Identity 2.0创建一个应用,管理员可以禁止其他用户。当他们禁止他们时,他们会退出(当他们下一步行动/请求时)。
这是我的禁令行动:
MERGE INTO GROUPING dst
USING (
SELECT ROWID AS rid
FROM GROUPING
START WITH grouping_id = 81
CONNECT BY PRIOR grouping_id = parent_id
) src
ON ( dst.ROWID = src.RID )
WHEN MATCHED THEN
UPDATE SET CATEGORY_ID = 739720;
UpdateSecuritStampAsync执行注销部分。另外我认为如果我插入Startup.Auth.cs UseCookieAuthentication是好的,因为我在那里更改了一个东西以便用户注销(如果我错过了添加重要的东西,请在评论中写,我会添加它)
public async Task<ActionResult> Block(ApplicationUser formuser, string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
user.DeleteDate = DateTime.Now;
user.IsConfirmed = false;
await UserManager.UpdateSecurityStampAsync(user.Id);
return RedirectToAction("Index");
}
我将默认TimeSpan从30分钟更改为0(这可能是一个错误,但它有效)。 这个主题的主要问题是我想创建一些在用户注销时会显示消息的东西,我应该怎么做呢? (当管理员阻止用户时,用户在重新加载他的页面后,会收到一条消息,说明他被阻止使用不当等)
答案 0 :(得分:0)
更好地使用锁定/解锁用户而不是更新安全标记。看看How to lock and unlock account in Asp.Net Identity provider。
public virtual async Task<IdentityResult> LockUserAccount(string userId, int? forDays)
{
var result = await this.SetLockoutEnabledAsync(userId, true);
if (result.Succeeded)
{
if (forDays.HasValue)
{
result = await SetLockoutEndDateAsync(userId, DateTimeOffset.UtcNow.AddDays(forDays.Value));
}
else
{
result = await SetLockoutEndDateAsync(userId, DateTimeOffset.MaxValue);
}
}
return result;
}
public virtual async Task<IdentityResult> UnlockUserAccount(string userId)
{
var result = await this.SetLockoutEnabledAsync(userId, false);
if (result.Succeeded)
{
await ResetAccessFailedCountAsync(userId);
}
return result;
}
在您的登录操作或提供商处,您可以使用
if (userManager.IsLockedOut(userId))
{
context.SetError("invalid_grant", "The account is locked out of the system.");
return;
}
我不确定在没有他/她尝试登录的情况下如何在被锁定后立即通知用户,因为在他/她获得用户时没有用户的ID或用户名重定向到登录页面。但是,如果你这样做,那么你可以简单地使用IsLockedOut
方法来决定是否应该显示一个弹出窗口,说明你想对用户说些什么。