【问题标题】:How to refresh roles/claims of another user in ASP.NET如何在 ASP.NET 中刷新另一个用户的角色/声明
【发布时间】:2023-04-02 23:36:01
【问题描述】:

您好,我们遇到了 ASP.NET 身份问题。 我们有一个管理页面,允许我们将用户影响到角色。 (管理员等)。

问题在于,当我们将某个角色影响到某个人时,该角色在他注销/重新登录之前并不适用于他。

我们试着把

services.Configure<SecurityStampValidatorOptions>(options =>
{
   options.ValidationInterval = TimeSpan.Zero;
});

但这会导致在每次请求时传递 cookie 等问题太多。

有没有办法:

  • 强制注销其他用户
  • 无需重新登录即可刷新他的声明?

我想到 atm 的唯一解决方案是使用类似于要在某处更新的用户列表(例如 redis)并在中间件中检查此列表,如果用户在列表中,则使用 refreshSigninAsync()。

【问题讨论】:

    标签: c# asp.net asp.net-core


    【解决方案1】:

    您很接近,但我建议您更改配置。

    我已经添加了关于你为什么要这样做的额外解释,以防有人想了解思考过程。

    问题:

    当您的用户登录应用程序时,他们会收到一个 cookie,但当一个帐户退出时,用户仍然拥有有效的 cookie,因此他们并没有真正退出。

    如何强制退出:

    只要 cookie 有效,它就会被重复使用,因此您需要一种方法来使 cookie 无效。您通过安全标记使 cookie 无效。

    配置身份,使其定期重新验证 cookie。它将 cookie 中的安全标记与数据库版本进行比较,如果失败,您的用户需要重新进行身份验证。

    将以下配置添加到您的服务中:

    services.Configure<SecurityStampValidatorOptions(opts => opts.ValidationInterval = System.TimeSpan.FromMinutes(1));
    

    现在,您只需使用 UserManager 在用户存储中查找用户,更新角色(或执行任何操作),然后调用 UpdateSecurityStampAsync(user) 方法。例如:

    public async Task<IActionResult> OnPostUpdateRolesAsync(string userId)
    {
        var user = await _userManager.FindByIdAsync(userId);
        // do stuff
        await _userManager.UpdateSecurityStampAsync(user);
        return RedirectToAction(nameof(SomePage));
    }
    

    现在这会导致用户在下次重新验证 cookie 时退出并强制重新验证。

    注意事项: 就用户体验而言,这肯定是一种破坏性的方法,因为用户发出的任何 HTTP 请求都会在之后终止。 此外,它并不是真正的立即注销,仅从应用程序的角度来看,它是立即的。用户不知道他何时退出,只有在发出 http-request 时才会显示出来。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多