Web API代表adal id_token错误

时间:2018-06-13 10:43:01

标签: c# azure azure-active-directory sharepoint-online adal

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

此Web API在01.05.2018之前正常工作 - 它可以在2014年5月1日之前创建的旧应用服务中正常工作。

一位微软员工说:

  

作为我们安全加固工作的一部分,我们不允许使用id_token   兑换2018-05-01 00:00:00之后创建的任何申请。

在adal的登录过程中,我得到了id_token。 id_token具有与access_token相同的值: enter image description here

当我调用web 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

但问题出在哪里?

1 个答案:

答案 0 :(得分:1)

问题是您在前端和后端使用相同的应用程序标识,并且MS不允许您使用Id令牌(由于前者而在此处用作访问令牌)另一个访问令牌。

可能的解决方案:

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

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

另一个解决方案是使用ADAL.JS获取前端中的其他访问令牌,而不是在后端使用on-represent-in并将其附加到除Id令牌之外的所有API请求。 / p>