我有一个旧的 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 中会好得多。
我的理解是,这个
claims
的论点根本没有得到ManagedIdentityCredential
的支持。
它受 MSAL (https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.abstractacquiretokenparameterbuilder-1.withclaims?view=msal-dotnet-latest) 支持并用于条件访问错误场景。
据我所知,这是预期的场景:
您可能需要采用最后的解决方案。