Web API 代表 adal id_token 错误

Web API on-behalf-of adal id_token error

我在 Azure 中创建了一个 Web API。 此 Web API 在 SharePoint Online 中进行一些调用。一些 api 电话是代表。

此网站 API 在 2018 年 5 月 1 日之前都可以正常工作 - 它在 2018 年 5 月 1 日之前创建的旧应用程序服务上也可以正常工作。

一位微软工作人员说:

As part of our security hardening efforts we do not allow id_token redemption for any application created after 2018-05-01 00:00:00.

在adal登录过程中,我得到了id_token。 id_token 与 access_token 的值相同:

当我调用网络 api 时,我会将此令牌作为不记名令牌发送。 Web API 获取此令牌(字符串 accessToken)并启动方法 'AcquireTokenAsync':

        var clientID = ConfigurationManager.AppSettings["ClientID"];
        var clientSecret = ConfigurationManager.AppSettings["ClientSecret"];
        var tenant = ConfigurationManager.AppSettings["Tenant"];

        var appCred = new ClientCredential(clientID, clientSecret);
        var authContext = new AuthenticationContext(
            "https://login.microsoftonline.com/" + tenant);

        var resource = new Uri(sharePointUrl).GetLeftPart(UriPartial.Authority);

        var authResult = await authContext.AcquireTokenAsync(resource, appCred,
            new UserAssertion(accessToken));
        return authResult.AccessToken;

但是在调用 'AcquireTokenAsync' 的行中我收到了错误消息:

AADSTS240002: Input id_token cannot be used as 'urn:ietf:params:oauth:grant-type:jwt-bearer' grant

但是问题出在哪里呢?

问题是你在前端和后端使用相同的应用程序身份,MS不允许你使用Id令牌(因为前者你在这里用作访问令牌)获取另一个访问令牌。

可能的解决方案:

  • 再注册一个应用(前端JS应用应该是Native应用)
  • 它应该使用 API 的客户端 ID 或应用程序 ID URI 作为资源为您的后端 API 获取访问令牌
  • 然后 API 可以将访问令牌交换为另一个访问令牌

如果这是一个多租户应用程序,迁移可能并不容易。 如果它是单租户,那么一切都应该是可能的。 您的前端应用程序当然应该需要权限才能在 Azure AD 中调用您的后端 API,并且应该授予该权限。

另一种解决方案是在前端使用 ADAL.JS 获取另一个访问令牌,而不是在后端使用 on-behalf-of 并将其附加到所有 API 请求除了 Id 令牌。