我必须开发一个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不同?
由于
答案 0 :(得分:0)
Android是一个公共客户端,没有人应该在本机应用程序中执行机密客户端流程。客户端凭据适用于机密客户端流,因此不会在android中公开。 .net可以在服务器和客户端上使用,但这并不意味着您在本机应用程序中使用机密客户端流。