Asp.net web api 重新使用jwt从另一个API调用API

Asp.net web api 重新使用jwt从另一个API调用API,asp.net-web-api,oauth,oauth-2.0,owin,azure-active-directory,Asp.net Web Api,Oauth,Oauth 2.0,Owin,Azure Active Directory,我在Azure Active Directory中有一个单一租户场景,其中API1需要使用身份验证调用另一个API2,并且API1是从SPA调用的 将API1中从SPA接收到的用户JWT传递给API2进行身份验证是否正确 例如: 所有API都是使用ASP.NET Web API和SPA实现的,并使用用于JavaScript的Active Directory身份验证库(ADAL)。传递从第一步获得的令牌对于第二步来说是不正确的。每个访问令牌都有一个令牌所针对的特定受众,并且由于API 1和API

我在Azure Active Directory中有一个单一租户场景,其中API1需要使用身份验证调用另一个API2,并且API1是从SPA调用的

将API1中从SPA接收到的用户JWT传递给API2进行身份验证是否正确

例如:


所有API都是使用ASP.NET Web API和SPA实现的,并使用用于JavaScript的Active Directory身份验证库(ADAL)。

传递从第一步获得的令牌对于第二步来说是不正确的。每个访问令牌都有一个令牌所针对的特定受众,并且由于API 1和API 2不同,该令牌的受众值只能与这两个令牌中的一个匹配

您可以链接到正确的示例,该示例代表流。此流允许API 1将第一个令牌交换为全新的令牌,其中客户端成为API 1,资源成为API 2

您可以找到协议的描述


谢谢你明确的回答,但我还有一个疑问。这将是尽管API2在同一个Azure租户上(将是一个内部调用),并且我可以“潜在地”在API2中使用与API1相同的访问者/客户端ID?看起来这只是一个“概念性”的限制?为什么我不能做呢?你能告诉我我缺少的协议概念吗?如果API 1和API 2使用相同的客户端ID和应用程序ID uri(资源标识符),那么它们绝对可以共享相同的访问令牌。。。我的问题是,这真的代表了两种不同的服务吗?您的图片暗示了两个独特的应用程序,但如果它们共享相同的应用程序注册,那么在身份验证和授权方面就没有区别。我想补充一点,最终,OAuth 2用于保护资源,使其不会将数据发送给错误的客户端。一天结束时,API2可以给任何将随机字符串作为访问令牌传递的客户端提供访问权限。在这方面,您可以对api进行编程,以接受受众声明中具有错误资源的令牌。。。这些选择取决于您,但这与OAuth 2所规定的有所不同。在我的例子中,两个API都托管在不同的应用程序服务中,但在同一租户上。我真的不确定为API 1注册另一个“Azure AD应用程序”是否“有意义”,例如,为了执行“代表”流。我想说,在同一租户中注册的应用程序在两个应用程序之间的授权方面实际上毫无意义。所以在你的决定中忽略这些方面。如果应用程序在逻辑上和物理上是不同的标识,那么您应该为每个应用程序注册单独的应用程序。否则,这取决于你。如果不分离应用程序标识,您可能会遇到其他常见问题:应用程序名称、应用程序品牌、应用程序角色/分配、生命周期管理等。。。
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        TokenValidationParameters = new TokenValidationParameters() {
            SaveSigninToken = true,
            ...
// line breaks for legibility only

POST /oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&client_id=625391af-c675-43e5-8e44-edd3e30ceb15
&client_secret=0Y1W%2BY3yYb3d9N8vSjvm8WrGzVZaAaHbHHcGbcgG%2BoI%3D
&resource=https%3A%2F%2Fgraph.windows.net
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiJodHRwczovL2Rkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tLzE5MjNmODYyLWU2ZGMtNDFhMy04MWRhLTgwMmJhZTAwYWY2ZCIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzI2MDM5Y2NlLTQ4OWQtNDAwMi04MjkzLTViMGM1MTM0ZWFjYi8iLCJpYXQiOjE0OTM0MjMxNTIsIm5iZiI6MTQ5MzQyMzE1MiwiZXhwIjoxNDkzNDY2NjUyLCJhY3IiOiIxIiwiYWlvIjoiWTJaZ1lCRFF2aTlVZEc0LzM0L3dpQndqbjhYeVp4YmR1TFhmVE1QeG8yYlN2elgreHBVQSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiJiMzE1MDA3OS03YmViLTQxN2YtYTA2YS0zZmRjNzhjMzI1NDUiLCJhcHBpZGFjciI6IjAiLCJlX2V4cCI6MzAyNDAwLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJnaXZlbl9uYW1lIjoiTmF2eWEiLCJpcGFkZHIiOiIxNjcuMjIwLjEuMTc3IiwibmFtZSI6Ik5hdnlhIFRlc3QiLCJvaWQiOiIxY2Q0YmNhYy1iODA4LTQyM2EtOWUyZi04MjdmYmIxYmI3MzkiLCJwbGF0ZiI6IjMiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiJEVXpYbkdKMDJIUk0zRW5pbDFxdjZCakxTNUllQy0tQ2ZpbzRxS1MzNEc4IiwidGlkIjoiMjYwMzljY2UtNDg5ZC00MDAyLTgyOTMtNWIwYzUxMzRlYWNiIiwidW5pcXVlX25hbWUiOiJuYXZ5YUBkZG9iYWxpYW5vdXRsb29rLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im5hdnlhQGRkb2JhbGlhbm91dGxvb2sub25taWNyb3NvZnQuY29tIiwidmVyIjoiMS4wIn0.R-Ke-XO7lK0r5uLwxB8g5CrcPAwRln5SccJCfEjU6IUqpqcjWcDzeDdNOySiVPDU_ZU5knJmzRCF8fcjFtPsaA4R7vdIEbDuOur15FXSvE8FvVSjP_49OH6hBYqoSUAslN3FMfbO6Z8YfCIY4tSOB2I6ahQ_x4ZWFWglC3w5mK-_4iX81bqi95eV4RUKefUuHhQDXtWhrSgIEC0YiluMvA4TnaJdLq_tWXIc4_Tq_KfpkvI004ONKgU7EAMEr1wZ4aDcJV2yf22gQ1sCSig6EGSTmmzDuEPsYiyd4NhidRZJP4HiiQh-hePBQsgcSgYGvz9wC6n57ufYKh2wm_Ti3Q
&requested_token_use=on_behalf_of
&scope=openid