如何在 .netframework API 中使用 OAuth 2.0 On-Behalf-Of

Posted

技术标签:

【中文标题】如何在 .netframework API 中使用 OAuth 2.0 On-Behalf-Of【英文标题】:How to use OAuth 2.0 On-Behalf-Of in .netframework API 【发布时间】:2021-05-16 14:52:17 【问题描述】:

我有 2 个 API,我想使用 OAuth 2.0 On-Behalf-Of 流在 API1 中生成令牌并使用生成的令牌授权给 API2。

我关注了https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow#middle-tier-access-token-request,并且能够生成令牌。 我使用以下参数:

grant_type:urn:ietf:params:oauth:grant-type:jwt-bearer
client_id:xxxxx
client_secret:xxxxxx
requested_token_use:on_behalf_of
scope:https://graph.microsoft.com/user.read

但我不知道如何使用该令牌对我的 API2 进行身份验证并获取用户以及下一步是什么。我的 API 使用 .netframework 应用程序。

我创建了 OwinStartup 并添加了 UseWindowsAzureActiveDirectoryBearerAuthentication

 app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions()
            
                Tenant = "xxxxxxxxxx",// Azure tenant Id
                TokenValidationParameters = new TokenValidationParameters()
                
                    SaveSigninToken = true,
                    ValidAudience = "https://graph.microsoft.com"
                
            );

并将 Authorize 属性添加到我的控制器中。但是当我调用该控制器的 get 端点时,它给了我一个错误说: 此请求的授权已被拒绝。

【问题讨论】:

【参考方案1】:

你需要请求两个令牌,一个是API A的访问令牌,另一个是使用API​​的访问令牌获得的API B的访问令牌A 作为参数。

你参考的文档是基于你获取的api A access token,有instructions in the document。

首先需要使用auth code flow或其他登录流程获取api A的访问令牌:

然后以API A的访问令牌为参数,获取API B的访问令牌。

【讨论】:

我已经在 API A 中完成了那部分,并且我有令牌。但是当我将访问令牌作为 Authorization(Bearer) 标头传递给 API B 时,我得到了一个错误。此请求的授权已被拒绝。我在 API B statup.cs 类中添加了 app.UseWindowsAzureActiveDirectoryBearerAuthentication。但没有帮助【参考方案2】:

在 API A 中,我使用了错误的范围来生成令牌。 https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow#middle-tier-access-token-request

【讨论】:

以上是关于如何在 .netframework API 中使用 OAuth 2.0 On-Behalf-Of的主要内容,如果未能解决你的问题,请参考以下文章

无法在 .netframework 4.61 API 中安装 IdentityServer3.AccessTokenValidation

使用 .NET Framework 3.5 在 C# 中调用 Web API

如何在 Web ASP.NET (.NET Framework) 中创建启动文件?

如何使用 .net 框架 2.0 在 Web 服务中使用 Web api

WebHook和API 及.NetFramework 实现

如何调试使用 REST API 的 Zapier 集成?