我做了一个单一的租户身份验证,对我来说很好。现在我将应用程序更改为多租户身份验证。我已将应用程序从单租户更改为天蓝色的多租户。但我无法在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应用程序访问权限集或默认权限。任何人都可以建议吗?谢谢!
答案 0 :(得分:2)
你所要求的是无法做到的。
您尝试使用的API(抱怨缺少客户端密钥)是ROPC流程。 它无法做出同意。
为了获得同意,用户必须进入Web浏览器,转到授权端点,并授权您的应用访问其目录。
正如我所看到的那样,使用您的用户名和密码的人不能只为他们想要的任何内容授予权限。 必须是用户说这些东西都没问题。 无论如何,他们永远不必将密码提供给您的应用。
如果您的应用无法提供网络浏览器用户界面,则一种方法是使用设备代码验证。 这里的.NET示例:{{3}}。
在设备代码流程中,您要求用户打开浏览器并导航到一个简短的URL。 然后他们必须输入显示给他们的代码,然后他们可以在浏览器中同意。 您的应用必须轮询端点以了解它何时完成。
可悲的是,似乎Adal4J尚未提供此API。 它可以在.NET版本中使用:{{3}}。