Microsoft Identity - 从角色中删除用户,但用户在注销之前仍然可以访问

Posted

技术标签:

【中文标题】Microsoft Identity - 从角色中删除用户,但用户在注销之前仍然可以访问【英文标题】:Microsoft Identity - removing user from role, but user still has access untill logout 【发布时间】:2017-05-04 11:27:36 【问题描述】:
ApplicationDbContext _context = new ApplicationDbContext();
UserManager<ApplicationUser> _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(_context));

我通过以下方式从角色中删除用户:

userManager.RemoveFromRole("userId", "roleName");

它几乎可以按照我的意愿工作。但是,如果我删除了当前登录到我的应用程序的用户,那么他仍然可以“授权”我的所有 WebApi 调用,直到他被注销。我做错了什么?

编辑:

或者我如何从代码中注销给定用户?

【问题讨论】:

【参考方案1】:

两件事:

确保在更改用户/角色后调用 _context.SaveChanges() 要要求用户的活动会话重新验证,使用 ASP.NET 中的 SecurityStamp 功能。 What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?

如果您使用 OAuth 声明,这是如何使会话无效的一个很好的示例:https://timmlotter.com/blog/asp-net-identity-invalidate-all-sessions-on-securitystamp-update/

希望这会有所帮助!

【讨论】:

我只是不明白为什么没有其他使用“RemoveFromRole”的例子不能解决这个问题。如果您从管理员角色中删除某人,并且他的会话设置为持续一年,那么他可能会为您的站点搞砸一切。为什么没有“简单”的方法来做到这一点,我认为这是一件非常必要的事情? @SimonSondrupKristensen 同意,这对于角色/用户/组等单个实体可能/应该更容易。我想,由于有一个标准机制(SecurityStamp)可以克服这个问题,而且这更像是一个会话/身份验证缓存问题,更适合使用会话验证代码(SecurityStamp)来处理,所以它在他们的优先级列表中很低。跨度>

以上是关于Microsoft Identity - 从角色中删除用户,但用户在注销之前仍然可以访问的主要内容,如果未能解决你的问题,请参考以下文章

从 Javascript 中的 JWT 中提取“角色”

从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

ASP.NET Core 3:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User

Microsoft.Identity Platform 登录循环

如何在 JWT 中包含身份角色声明?

在 Asp.net Identity MVC 5 中创建角色