Android 如何将 ADAL 库与 clientCredential 一起用于 aquireToken,然后调用托管在 Azure 上的 API

How Android use ADAL library with clientCredential to aquireToken then call API hosted on Azure

我必须开发一个 android 应用程序,它调用托管在 Azure 上的 API 操作。 对 API 的访问由 AD 管理。 API 在 Azure AD 中注册为 Web app/API。

我想要实现的是客户端应用程序通过提供客户端凭据从 AD 获取令牌,然后使用此令牌访问 API 操作。

通过使用 .net ADAL 库,我们可以实现如下:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Net.Http;
...

var cc = new ClientCredential(clientId, clientSecret);
var ac= new AuthenticationContext(authority,false);               
var token = ac.AcquireToken(resource,cc);

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new Headers.AuthenticationHeaderValue("Bearer",token.AccessToken);

var response = client.GetAsync(url).Result;
var responseContent= response.Content.ReadAsStringAsync().Result;

在 android 的 ADAL 库中,没有客户端凭据 class,因此为了从 AuthenticationContext class 获取令牌,我更改了 API 应用程序在 Azure AD 中从 Web App/API 键入本机。

然后下面的实现会提示一个 windows 登录页面,但我想使用存储在配置中的客户端凭据而不是手动登录弹出窗口:

AuthenticationContex authenticationContext = new AuthenticationContext(MainActivity.this,
                AUTHORITY, true);

authenticationContext.acquireToken(MainActivity.this, 
     RESOURCE, 
     CLIENT_ID, 
     REDIRECT_URI, 
     PromptBehavior.Always, 
     new AuthenticationCallback<AuthenticationResult>() {
          @Override
          public void onSuccess(AuthenticationResult result) {
                String idToken = result.getIdToken();
                String accessToken = result.getAccessToken();

                Log.d(LOG_TAG, "ID Token: " + idToken);
                Log.d(LOG_TAG, "Access Token: " + accessToken);
           }

           @Override
           public void onError(Exception exc) {
                  // TODO: Handle error
           }
     });

知道如何实现这一点以及 .Net 和 Android 的 ADAL 库不同的原因吗?

谢谢

Android 是一个 public 客户端,任何人都不应该在本机应用程序中执行机密客户端流程。客户端凭据用于机密客户端流,因此不会在 android 中公开。 .net 可用于服务器和客户端,但这并不意味着您在本机应用程序中使用机密客户端流。