Android如何将adal库与clientCredential一起使用到aquireToken,然后调用Azure上托管的API

时间:2016-11-24 02:56:06

标签: android api azure adal

我必须开发一个Android应用程序,它调用Azure上托管的API操作。 对API的访问由AD管理。 API在Azure AD中注册为Web应用程序/ 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库中,没有客户端凭据类,因此为了从AuthenticationContext类获取令牌,我已将API应用程序类型从Web App / API更改为Azure AD中的Native。

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

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
           }
     });

任何想法如何实现以及为什么ADAL库与.Net和Android不同?

由于

1 个答案:

答案 0 :(得分:0)

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