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



我有一个.NET Core网络应用程序,它使用Azure Active Directory对用户进行身份验证。我已经在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公司帐户进行身份验证。

然而,在我的一个控制器中,我需要检查用户是哪个security groups的成员,以执行一些安全检查。因此,我使用此代码来检查用户是否属于某个安全组:

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

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

这是一个大问题,因为这意味着,例如,如果我从安全组中删除一个用户,那么在该用户注销之前,该更改不会反映在我的网络应用程序中。这意味着用户可能能够访问他不再被授权访问的数据,因为网络应用程序仍然认为他属于旧组。

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

所以我的问题是:

  • 这是预期行为吗?还是我做错了什么
  • 有没有一种方法可以强制索赔列表";sync";使用Azure AD
  • 如果没有,有没有一种方法可以在我的网络应用程序停止和重新启动时强制注销所有用户,这样我就知道所有用户都被迫重新登录,这反过来又会更新他们的声明

我使用这里发布的实现解决了这个问题:

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

这种方法使用ram支持的服务器端对象来存储会话数据,因此所有用户信息和声明都存储在cookie中,而不是存储在服务器上,cookie只包含服务器用于识别会话的令牌。这保证了在网络应用程序重新启动时清除会话,从而解决了我的问题。

最新更新