Entra ID - 通过客户端凭证流程将参与者声明添加到令牌

问题描述 投票:0回答:1

我有一个旧的 ASP.NET MVC 应用程序,它使用 ASP.NET 成员身份登录用户并发出登录 cookie。我的应用程序需要调用受 Entra ID 保护的 API(用户本身没有 Entra ID 帐户,也没有访问该 API 的权限)。应用服务器可以使用客户端凭据流(服务主体或 Azure 托管标识)获取 API 的令牌。

有没有办法将“参与者”声明(或任何任意名称声明)添加到为应用程序服务器颁发的访问令牌,其中包含我的会员用户的用户名?

我似乎无法使用代表流程,因为我的用户未在 EntraID 中注册,并且本身无权访问 API,因此我陷入了客户端凭据流程。

claims
中有一个
TokenRequestContext
参数,但这似乎没有任何效果 - 传递到 EntraID 令牌端点的声明似乎被忽略了。我想知道为什么这个参数在那里。

var azureCredential = new ManagedIdentityCredential();

var claimsDict = new Dictionary<string, string>
{
    { "actor", "[email protected]" }
};

var claimsJson = JsonConvert.SerializeObject(claimsDict);

var context = new TokenRequestContext(scopes: new[] { scope }, claims: claimsJson);

var accessToken = await azureCredential.GetTokenAsync(context);

return accessToken.Token; // Doesn't have "actor" claim.

我最后的解决方案是将

actor
作为自定义 HTTP 标头传递,向服务主体添加自定义角色(类似于
can_specify_actor
),并让 API 从标头中获取参与者(如果用户具有此角色)。这远非理想,如果声明在 JWT 中会好得多。

asp.net-mvc azure-active-directory openid azure-ad-msal microsoft-entra-id
1个回答
0
投票

我的理解是,这个

claims
的论点根本没有得到
ManagedIdentityCredential
的支持。 它受 MSAL (https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.abstractacquiretokenparameterbuilder-1.withclaims?view=msal-dotnet-latest) 支持并用于条件访问错误场景。

据我所知,这是预期的场景:

  1. 应用程序尝试代表用户获取令牌
  2. 条件访问策略会阻止它,因为用户必须执行 MFA
  3. MSAL 返回已设置 Claims 属性的错误
  4. 应用程序使用 MSAL 凭据将此声明值传递给该参数
  5. 触发交互式认证,这次我们可能会得到一个token

您可能需要采用最后的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.