.net core OAuth 2.0身份验证代码授权流与客户端凭据授权流

.net core OAuth 2.0身份验证代码授权流与客户端凭据授权流,.net-core,oauth-2.0,azure-active-directory,openid-connect,.net Core,Oauth 2.0,Azure Active Directory,Openid Connect,我们有一个第三方移动应用程序。它在登录过程中创建一个访问令牌,以使用授权码授权流访问我们的API(.netcore)之一 该移动应用程序显示了许多互动程序。登录后,当用户单击其中一个tile时,我想调用另一个.netcore API(使用access\u令牌) 我计划在第二个API调用中使用客户端凭据流,因为它不需要用户交互 但是API端点(在代码中)检查声明以获取用户ID,并且客户端凭据流创建一个没有用户信息的jwt令牌(因为没有用户交互) 我是否使用了正确的流程?单击互动程序(无需

我们有一个第三方移动应用程序。它在登录过程中创建一个访问令牌,以使用授权码授权流访问我们的API(.netcore)之一

该移动应用程序显示了许多互动程序。登录后,当用户单击其中一个tile时,我想调用另一个.netcore API(使用access\u令牌)

我计划在第二个API调用中使用客户端凭据流,因为它不需要用户交互

但是API端点(在代码中)检查声明以获取用户ID,并且客户端凭据流创建一个没有用户信息的jwt令牌(因为没有用户交互)


我是否使用了正确的流程?单击互动程序(无需用户交互)时,是否有方法使用授权代码授权流?

您只能在使用需要用户交互的授权代码流时获取用户信息

我注意到您使用的是v1.0端点,您可以将api uri放在资源参数中。v1.0端点不需要范围参数。您可以在登录后以静默方式获取访问令牌

下面是代码片段供您参考

 // Because we signed-in already in the WebApp, the userObjectId is know
                string userObjectID = (User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;

                // Using ADAL.Net, get a bearer token to access the TodoListService
                AuthenticationContext authContext = new AuthenticationContext(AzureAdOptions.Settings.Authority, new NaiveSessionCache(userObjectID, HttpContext.Session));
                ClientCredential credential = new ClientCredential(AzureAdOptions.Settings.ClientId, AzureAdOptions.Settings.ClientSecret);
                result = await authContext.AcquireTokenSilentAsync(AzureAdOptions.Settings.TodoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

                // Retrieve the user's To Do List.
                HttpClient client = new HttpClient();
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, AzureAdOptions.Settings.TodoListBaseAddress + "/api/todolist");
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
                HttpResponseMessage response = await client.SendAsync(request);
参考:


另请注意,移动应用程序不应使用客户端凭据流,除非它来自其后端服务。客户端凭据需要使用机密/证书,在诸如移动应用程序之类的公共客户端应用程序中不应使用该证书。@juunas,该应用程序还具有服务器端代码部分。因此,我计划编写一个Azure函数,它使用客户端凭据流(ADAL.NET)来创建访问令牌(在我们的Azure平台中托管Azure函数)。然后,移动应用服务器代码将访问Azure功能以获取访问令牌。然后,它将从apps服务器端将其传递到API调用的标题中。在这种情况下使用客户端凭据可以吗?谢谢Tony,我将查看代码并让您知道。好的,后端函数肯定可以使用客户端凭据调用API。如果您希望以用户身份调用API,并且您拥有一个包含用户信息的访问令牌,那么您还可以使用“代表授权”为您想要访问的API获取一个包含用户信息的新令牌call@juunas,下面链接中的流程图显示了需要在应用程序中首先对用户进行身份验证。此外,我没有下游API(流程图中的Web API B)。那么,我怎样才能使用ob代表?你知道一些代码示例吗?