声称经过身份验证的用户缺少数据

问题描述

我们有一个 ASP.NET (Framework v4.7.2) 网站,该网站使用联合登录,通过 Azure Active Directory,用于 SSO 目的,对用户进行身份验证。

该网站希望用户属于某个 Active Directory 组,以便访问该网站。我自己和另一个用户在同一个组中,但是当我们都访问该站点时,我们得到了不同的结果。我可以访问该网站,但我的同事收到了“401 unathorised”错误页面(通过 AuthorizeAttribute 返回)。

深入研究,我可以将我所属的 AD 组作为声明包含在此集合中

System.Security.Claims.ClaimsPrincipal.Current.Claims

但是对于我的同事来说,缺少相同的群组声明。

我有一些调试代码可以做到这一点...

foreach (var claim in System.Security.Claims.ClaimsPrincipal.Current.Claims)
{
    if (string.Equals("the-object-id-of-the-group",claim.Value))
    {
        // User has the group claim...
    }
}

当我登录时,我看到一条日志消息,指出我拥有该群组声明,但我的同事在登录时没有看到该消息。

在 Chrome DevTools 中查看我们对网站的请求时,我可以看到一堆 set-cookie 详细信息有所不同。例如,我的请求包含比我同事多得多的 AdminFedAuth set-cookie 调用,而且我同事的整体内容长度要短得多。

虽然我的同事是比我更多的 AD 组的成员,但这没有什么区别,因为其他人可以访问该站点是比我更多的组的成员。所以我认为这可能是一个人所关联的群体数量的问题,但事实并非如此。

我被困在还有什么要调查的地方,以诊断问题所在。任何建议将不胜感激。

解决方法

答案是我必须更改 Azure Active Directory 中应用注册的清单。

在 Manifest 中我改变了

"groupMembershipClaims": "SecurityGroup"

"groupMembershipClaims": "ApplicationGroup"

使用 SecurityGroup 导致返回到网站的组声明数据不一致。通过使用 ApplicationGroup,所有特定于应用程序的组声明都将被返回,从而解决了一些经过身份验证的用户无法访问该站点的问题。

供参考...

Configure the Azure AD Application Registration for group attributes

编辑:

另一个很好的参考是这个 StackOverflow 问题...

Azure AD does not emit group claims

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...