Azure Active Directory - 用户的组声明不是最新的

标签 azure asp.net-core .net-core azure-active-directory .net-core-2.2

我有一个.NET Core使用Azure Active Directory的web应用程序对用户进行身份验证。我已在 Azure AD 中配置了应用程序访问权限,然后将其放入我的 Startup 中类:

//Use Azure Active Directory OAuth 2.0 authentication
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("AzureAd", options)); //AzureAD settings are stored in appsettings.json

此操作正常,用户可以成功使用其 Azure AD 公司帐户进行身份验证。

但是,在我的一个 Controller 内,我需要检查哪个 security groups用户是其成员,以执行一些安全检查。因此,我使用此代码来检查用户是否属于某个安全组:

var groupClaims = User.HasClaim(claim => claim.Type == "group" && claim.Value == mySecurityGroupUid);

这有效......有点。
问题是Claim的集合位于 User 内仅当用户注销 Web 应用程序并重新登录时,对象才会更新。如果用户没有明确注销 Web 应用程序并重新登录,则声明列表不会更新。

这是一个大问题,因为这意味着,例如,如果我从安全组中删除用户,则在用户注销之前,该更改不会反射(reflect)在我的 web 应用程序中。这意味着用户可能能够访问他无权再访问的数据,因为 Web 应用程序仍然认为他属于旧的组集。

即使停止并重新部署 Web 应用程序也不会更新组,我发现强制更新组的唯一方法是让用户明确注销 Web 应用程序并重新登录。

所以我的问题是:

  • 这是预期的行为吗?还是我做错了什么?
  • 有没有办法强制声明列表与 Azure AD“同步”?
  • 如果没有,是否有办法在我的网络应用停止并重新启动时强制注销所有用户,以便我知道所有用户都被迫重新登录,从而更新他们的声明?

最佳答案

我通过使用此处发布的实现解决了这个问题:

https://stackoverflow.com/a/51210553/300741

此方法使用 ram 支持的服务器端对象来存储 session 数据,因此所有用户信息和声明都存储在服务器上,而不是存储在 cookie 中,并且 cookie 只包含服务器用来存储 session 数据的 token 。识别 session 。这保证了当 web 应用程序重新启动时 session 被清除,解决了我的问题。

关于Azure Active Directory - 用户的组声明不是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65236807/

相关文章:

c# - ASP.Net Core 2.1 IdentityCore(用户登录时未添加角色声明)

asp.net - 发布时出现 Dot Net Core 构建错误 - 目标标签名称不能为空或空格

java - 无法验证在 Java Spring Boot 应用程序中使用 .Net Core 生成的 JWT token 的签名

azure - Azure 上的 Hadoop 使用 IaaS

azure现有VPN和网关,添加地址空间

.net - Azure AD 身份验证,为 React、.Net Core Web api 项目提供错误 Unauthorized_client

c# - 如何使用 .net 核心默认服务容器注册特定接口(interface)的所有类

asp.net-core - 从 ASP.NET 5 调用 ADODB COM 对象

azure - 日志分析解决方案、见解和工作簿之间的区别

winforms - 如何使用 .NET Core 通用主机运行 Winforms 并让它控制主机生命周期?