ASP.NET Core 如何实现立即生效清除双因素认证「记住本机」偏好
你碰到的这个现象是ASP.NET Core Identity的设计逻辑导致的:
IsTwoFactorClientRememberedAsync是读取本次请求携带的Cookie值来判断状态,请求进入服务器时Cookie就已经固定,不会随后续操作变更ForgetTwoFactorClientAsync实际做的是往响应头里添加Set-Cookie指令,告诉浏览器下次请求不要带这个双因素记住的Cookie,不会修改本次请求已经解析好的Cookie数据,所以同请求内二次校验还是会返回true。
解决方案
方案1:同请求内添加本地状态标记(最简便)
调用清除方法后直接记录状态,后续判断优先走本地标记,不需要二次调用查询方法:
bool is2FaClientRemembered = await _signInManager.IsTwoFactorClientRememberedAsync(user); if (is2FaClientRemembered) { await _signInManager.ForgetTwoFactorClientAsync(); // 手动更新本地标记,同请求后续判断直接用这个变量即可 is2FaClientRemembered = false; } // 后续所有判断直接用is2FaClientRemembered变量,不需要再调用查询接口 if (is2FaClientRemembered) { // 这里就不会再进入了 }
方案2:手动清除本次请求的Cookie值(需要立即生效查询的场景)
如果你的业务逻辑必须要在同请求内再次调用IsTwoFactorClientRememberedAsync获得正确结果,可以手动删除本次请求里的对应Cookie:
if (await _signInManager.IsTwoFactorClientRememberedAsync(user)) { await _signInManager.ForgetTwoFactorClientAsync(); // 手动清除当前请求内的双因素记住Cookie,默认Cookie名是Identity.TwoFactorRememberMe // 如果你的Identity配置修改了Cookie名,改成你自定义的名称即可 Request.Cookies.Delete("Identity.TwoFactorRememberMe"); } if (await _signInManager.IsTwoFactorClientRememberedAsync(user)) { // 此时就不会进入该分支了 }
方案3:调用清除后立即重定向
如果你的业务流程允许跳转,调用完ForgetTwoFactorClientAsync之后直接返回重定向结果,下一次请求携带的Cookie就已经是清除后的状态,自然符合预期。
内容的提问来源于stack exchange,提问作者Nicholas Betsworth
相关产品推荐
相关产品推荐

