Azure:使用Java将单租户身份验证更改为多租户

时间:2018-02-26 15:55:42

标签: java azure azure-active-directory microsoft-graph multi-tenant

我做了一个单一的租户身份验证,对我来说很好。现在我将应用程序更改为多租户身份验证。我已将应用程序从单租户更改为天蓝色的多租户。但我无法在Java中找到任何用于多租户身份验证的代码。我需要对以下代码进行所有更改,以使其适用于多租户身份验证。 代码: -

private String getAccessToken() {
    String accessToken = "";
    try {
        ExecutorService service = Executors.newFixedThreadPool(1); 
        String authorization_url = "https://login.microsoftonline.com/" + Authentication_Constants.TENANT + "/oauth2/authorize/";
        AuthenticationContext authContext = new AuthenticationContext(authorization_url, false, service);
        ClientCredential clientCred = new ClientCredential(Authentication_Constants.CLIENTID, Authentication_Constants.SECRET);
        Future<AuthenticationResult>  future = authContext.acquireToken(Authentication_Constants.RESOURCE, clientCred, null);
        AuthenticationResult authResult = future.get(); 
        accessToken = authResult.getAccessToken();
    } catch (Exception ex) {
        System.out.println(ex.getLocalizedMessage());
    }
    return accessToken;
}

更新: - 我将授权网址更改为https://login.microsoftonline.com/common/oauth2/authorize/,这确实为我提供了访问令牌。对于多租户应用程序,应用程序的初始注册位于开发人员使用的Azure AD租户中。当来自其他租户的用户首次登录该应用程序时,Azure AD会要求他们同意应用程序请求的权限。如果他们同意,则在用户的租户中创建称为服务主体的应用程序的表示,并且可以继续登录。如果我已经拥有用户的凭据,我如何在不提供UI的情况下获得同意?如何在我当前的代码中插入这些内容以获取不同租户的访问令牌?

更新2: - 我尝试使用以下api进行身份验证: - authContext.acquireToken(Authentication_Constants.RESOURCE,Authentication_Constants.CLIENTID,“username”,Authentication_Constants.password,null);但我开始知道它不受支持。并获得以下异常: - “error_description”:“AADSTS70002:请求正文必须包含以下参数:'client_secret或client_assertion'。所以我在这个多租户身份验证中很丢失。

注意: - 我可以提供用户凭据,而不是访问Microsoft的登录页面,该凭据具有我的Web应用程序访问权限集或默认权限。任何人都可以建议吗?谢谢!

1 个答案:

答案 0 :(得分:2)

你所要求的是无法做到的。

您尝试使用的API(抱怨缺少客户端密钥)是ROPC流程。 它无法做出同意。

为了获得同意,用户必须进入Web浏览器,转到授权端点,并授权您的应用访问其目录。

正如我所看到的那样,使用您的用户名和密码的人不能只为他们想要的任何内容授予权限。 必须是用户说这些东西都没问题。 无论如何,他们永远不必将密码提供给您的应用。

如果您的应用无法提供网络浏览器用户界面,则一种方法是使用设备代码验证。 这里的.NET示例:{{3}}。

在设备代码流程中,您要求用户打开浏览器并导航到一个简短的URL。 然后他们必须输入显示给他们的代码,然后他们可以在浏览器中同意。 您的应用必须轮询端点以了解它何时完成。

可悲的是,似乎Adal4J尚未提供此API。 它可以在.NET版本中使用:{{3}}。