C# 在ASP.NET核心标识中删除登录用户的策略
在我的ASP.NET核心MVC应用程序中,管理员可能希望从其组织中删除一个普通用户。当然,使用内置标识模型,使用C# 在ASP.NET核心标识中删除登录用户的策略,c#,asp.net-core,asp.net-identity,C#,Asp.net Core,Asp.net Identity,在我的ASP.NET核心MVC应用程序中,管理员可能希望从其组织中删除一个普通用户。当然,使用内置标识模型,使用UserManager.deleteAync()方法,这是很简单的 但是,用户可能同时登录到多个设备。我不需要实时消息——我很高兴被删除的用户在下次请求时返回登录页面。信号员觉得在这种情况下太过分了 Request.User.Identity.IsAuthenticated在其会话期间保持为true,即使其帐户已从备份存储中删除 我的思想过程是覆盖基本控制器上的OnActionExec
UserManager.deleteAync()
方法,这是很简单的
但是,用户可能同时登录到多个设备。我不需要实时消息——我很高兴被删除的用户在下次请求时返回登录页面。信号员觉得在这种情况下太过分了
Request.User.Identity.IsAuthenticated
在其会话期间保持为true,即使其帐户已从备份存储中删除
我的思想过程是覆盖基本控制器上的OnActionExecutingAsync()
,并在每次请求时检查备份存储中的有效记录,然后采取适当的措施(例如注销+重定向到登录),但这感觉像是对每个请求执行的一项重大开销,特别是因为备份存储是CosmosDb,这将花费额外的请求单元
我还需要考虑Ajax请求,因为MVC应用程序中的重要页面具有动态元素,用户可能在很长一段时间内停留在单个页面上。
检查他们的用户帐户是否在下一次请求时被删除的最有效、最轻量级的方法是什么?你说得对,每次请求时检查都是低效的。因为您提到管理员希望能够手动删除,所以在删除和强制注销之间延迟几秒钟不会是问题(这与几秒钟后删除相同) 在定义您正在使用.NET核心标识时,您只需定义
SecurityStampValidatorOptions
,例如
services.Configure<SecurityStampValidatorOptions>(options =>
{
options.ValidationInterval = TimeSpan.FromMinutes(1);
});
services.Configure(选项=>
{
options.ValidationInterval=TimeSpan.FromMinutes(1);
});
这会导致每分钟验证一次用户令牌。如果将
ValidationInterval
设置为。从分钟数(0)
,则令牌将在每次请求时进行验证(我认为这类似于3次数据库调用以进行验证)。我的建议是不要将0
作为一个值,而是一个您认为在手动删除用户和将其强制退出应用程序之间的时间跨度内可以接受的值。由于IsAuthenticated
与用户的cookie绑定,因此在删除帐户时您无法找到它。在OnActionExecutingAsync()期间检查有效帐户将影响所有用户,因此不确定是否需要。这样如何:有一个静态列表,其中包含已删除的帐户ID。删除时,将id添加到此列表。在每个请求期间,检查列表,如果在列表中找到id,则清除cookie,从列表中删除I'd,然后重定向到登录。请记住,在web服务器场中,静态列表将不起作用。它跨多个Azure服务器进行了扩展,因此Azure存储可能可以正常工作。但仍然影响所有用户。我认为@citronas answer适用于我的情况。它对所有用户的影响非常小,因为您所做的只是检查内存中的列表,其中可能有一些项目。答案中的方法将产生更大的影响,因为每x分钟(在您的情况下为5分钟),每个用户都需要重新验证,因此将有更多的db调用。但是如果你不介意额外的数据库访问和呼叫,那么它应该是好的。非常好。很高兴有5分钟的时间来保留对服务器的不必要呼叫。谢谢