使用ClientCredential + login / password

时间:2017-12-04 14:25:04

标签: adal adal4j

我使用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)

是否应该添加?或者我认证的方式是错误的?

最好的问候。

1 个答案:

答案 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应用程序。

为什么缺少这个?这种联系方式确实有意义,或者它是一种不敏感的方式?

最好的问候。