我有一个.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/