【问题标题】:Re use jwt to call API from another API重新使用 jwt 从另一个 API 调用 API
【发布时间】:2017-08-10 13:23:55
【问题描述】:

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

只传递从 SPA 在 API1 中接收到的用户 JWT 以调用 API2 进行身份验证是否正确?

new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        TokenValidationParameters = new TokenValidationParameters() {
            SaveSigninToken = true,
            ...

点赞:https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

所有 API 均通过 ASP.NET Web API 和 SPA 使用 JavaScript 的 Active Directory 身份验证库 (ADAL) 实现。

【问题讨论】:

    标签: asp.net-web-api oauth oauth-2.0 owin azure-active-directory


    【解决方案1】:

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

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

    你可以找到协议的描述here

    // 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
    

    【讨论】:

    • 感谢您的明确回答,但我仍有疑问。尽管 API2 在同一个 Azure 租户上(将是一个内部调用),但我可以“可能”在 API2 中使用与 API1 中相同的 Audience/ClientId 吗?看起来这只是一个“概念”限制?为什么我做不到?您能否说明/参考我缺少的协议概念?
    • 如果 API 1 和 API 2 使用相同的客户端 ID 和应用 ID uri(资源标识符),那么它们绝对可以共享相同的访问令牌......我当时的问题是这真的代表两种不同的服务?您的图片暗示了两个独特的应用程序,但是如果它们共享相同的应用程序注册,那么在身份验证和授权方面就没有区别
    • 我想补充一点,最终,OAuth 2 用于保护资源不向错误的客户端提供数据。归根结底,API 2 可以授予任何将随机字符串作为访问令牌传递的客户端的访问权限。在这方面,您可以对您的 api 进行编程,以在受众声明中接受具有错误资源的令牌......这些选择取决于您,但这与 OAuth 2 指定的内容有所不同
    • 好的。在我的情况下,两个 API 都托管在不同的应用服务中,但在同一个租户上。例如,真的不确定为 API 1 注册另一个“Azure AD 应用程序”是否“有意义”,以便执行“代表”流程。
    • 我会说在同一个租户中注册的应用程序在两个应用程序之间的授权方面实际上没有任何意义。所以从你的决定中忽略这些方面。如果应用程序在逻辑上和物理上是不同的身份,那么您应该为每个应用程序注册单独的应用程序。否则,这取决于你。如果您不分离应用程序身份,您可能会遇到的其他常见问题:应用程序名称、应用程序品牌、应用程序角色/分配、生命周期管理等......
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2020-09-10
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多