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 令牌。
我在 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 令牌。