【问题标题】:Invalid access token from Azure Active Directory using OpenIdConnect使用 OpenIdConnect 来自 Azure Active Directory 的访问令牌无效
【发布时间】:2020-09-26 18:08:27
【问题描述】:

每当用户通过 Azure Active Directory OAuth 登录到我的应用程序时,我想检查用户的 Active Directory 组并根据它们分配角色。我的应用程序正在运行 Orchard Core,所以我想使用 Orchard 的内置 AAD 身份验证模块来实现它。

我无法使用任何配置,因此我将整个模块的源代码复制到我的应用程序中(使用 Orchard 作为 NuGet 包)并手动修改 OpenIdConnct 配置以在发出令牌时添加事件侦听器然后调用 Microsoft Graph API 来检索组信息。

问题是我收到的令牌看起来是有效的(我在 jwt.io 上检查过,令牌的范围是:"scp": "offline_access openid profile User.Read")。 但是当我尝试在 Graph API 中使用此令牌时,它会以 Access Token missing or malformed. 进行响应。

我花了很多时间,但不知道为什么会这样。

我使用的代码如下:

options.ClientId = azureADOptions.ClientId;
options.ClientSecret = azureADOptions.ClientSecret;
options.Authority = new Uri(new Uri(azureADOptions.Instance), azureADOptions.TenantId).ToString();
options.CallbackPath = azureADOptions.CallbackPath ?? options.CallbackPath;
options.SignedOutCallbackPath = azureADOptions.SignedOutCallbackPath ?? options.SignedOutCallbackPath;
options.SignInScheme = "Identity.External";

options.Scope.Add("openid");
options.Scope.Add("offline_access");
options.Scope.Add($"api://{azureADOptions.ClientId}");

options.Resource = azureADOptions.ClientId;
options.Scope.Add(HttpUtility.HtmlEncode(GraphService.GraphInstance));
options.ResponseType = OpenIdConnectResponseType.IdTokenToken;

options.Events.OnMessageReceived += context =>
        {
            return Task.CompletedTask;
        };

options.Events.OnTokenResponseReceived += context =>
        {
            return Task.CompletedTask;
        };

options.Events.OnTicketReceived += context =>
        {
            return Task.CompletedTask;
        };

我已读取事件处理程序中的访问令牌并使用邮递员调用 Graph API,但失败了。

有什么问题?

【问题讨论】:

  • 如果我的答案对您有帮助,您可以接受它作为答案(点击答案旁边的复选标记,将其从灰色切换为已填充。)。见meta.stackexchange.com/questions/5234/…。这对其他社区成员可能是有益的。谢谢。

标签: c# asp.net .net-core oauth-2.0 azure-active-directory


【解决方案1】:

您无需调用 Microsoft Graph API 即可检索组信息。您只需修改应用清单参考here中的“groupMembershipClaims”字段:

"groupMembershipClaims": "SecurityGroup"

然后令牌将包含使用所属组的 ID,如下所示:

{ "groups": ["93d96b98-cc9b-410e-a5c8-105883edexxx"] }

然后就可以在代码中根据group id找到用户了。

您还可以定义一些应用程序角色并将角色分配给组。然后,该组中的用户将有以下声明:

{ "roles": ["admin"] }

然后你可以根据用户的角色来实现你的授权逻辑。

更多详情请参考:https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps

更新:

由于令牌最多只能包含 200 个组,因此使用此方法要求您的用户属于少于 200 个组。

【讨论】:

  • 请注意,令牌中包含的组有最大限制。如果用户的 IIRC 组超过 200 个,则令牌中不会包含任何组,而必须从 MS Graph API 查询它们。
  • @juunas 谢谢你的补充,你是对的,我会更新我的答案。
  • 谢谢,我也在几个小时后想通了,但不知道限制。但是,我仍然想知道为什么访问令牌不起作用?
【解决方案2】:

我对果园不太熟悉,但你确定你得到的是访问令牌而不是 id 令牌吗?从我所看到的情况来看,您可能会获得一个 id 令牌。这可以解释失败, 您需要一个具有范围的访问令牌才能访问图表。

【讨论】:

  • 是的,options.ResponseType = OpenIdConnectResponseType.IdTokenToken; 选项配置它,我得到了 Id 和 Access 令牌。两者都是有效的(在 jwt.io 上检查)但它们都不能用于 Graph 授权。
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2020-05-25
  • 2019-08-25
  • 2017-10-12
  • 2019-01-01
相关资源
最近更新 更多