我使用Adal4j连接到Azure AD,让Native App访问MS CRM Web API。
我们使用此方法获取令牌:
AuthenticationContext : public Future<AuthenticationResult> acquireToken(
final String resource, final String clientId,
final String username, final String password,
final AuthenticationCallback callback)
现在我想为Web应用程序使用相同的代码。因此,我在Azure AD中注册了一个Web应用程序,其中“代理权限”和“组织使用时访问CRM Online”已选中。
我首先尝试了任何更改,但我收到了此错误:
{“error_description”:“AADSTS70002:请求正文必须包含以下参数:'client_secret或client_assertion'。\ r \ nTrace ID:xxxxxxxxxxxxxxxxxxxx \ r \ n相关ID:xxxxxxxxxxxxx \ r \ n时间戳:2017-12-01 14:18:03Z”, “错误”: “invalid_client”}
为了测试,我更新了ClientAuthenticationPost.toParameters()
方法来强制client_secret,它可以工作:
Map<String, String> toParameters() {
Map<String, String> params = new HashMap<String, String>();
params.put("client_id", getClientID().getValue());
params.put("client_secret", "___my_client_secret___"); // added line
return params;
}
我的问题是,为什么没有这样的方法'clientCredential + Login / password':
AuthenticationContext : public Future<AuthenticationResult> acquireToken(
final String resource, final ClientCredential clientCredential, // ClientCredential = client_id + client_secret
final String username, final String password,
final AuthenticationCallback callback)
是否应该添加?或者我认证的方式是错误的?
最好的问候。
答案 0 :(得分:0)
这是我添加了AuthenticationContext类的辅助方法:
public Future<AuthenticationResult> acquireToken(final String resource,
final ClientCredential clientCredential, final String username,
final String password, final AuthenticationCallback callback) {
if (StringHelper.isBlank(resource)) {
throw new IllegalArgumentException("resource is null or empty");
}
if (clientCredential == null) {
throw new IllegalArgumentException("client credential is null");
}
if (StringHelper.isBlank(username)) {
throw new IllegalArgumentException("username is null or empty");
}
if (StringHelper.isBlank(password)) {
throw new IllegalArgumentException("password is null or empty");
}
final ClientAuthentication clientAuth = new ClientSecretPost(
new ClientID(clientCredential.getClientId()), new Secret(
clientCredential.getClientSecret()));
return this.acquireToken(new AdalAuthorizatonGrant(
new ResourceOwnerPasswordCredentialsGrant(username, new Secret(
password)), resource), clientAuth, callback);
}
它适用于我已注册的具有委派权限的Web应用程序。
为什么缺少这个?这种联系方式确实有意义,或者它是一种不敏感的方式?
最好的问候。