重定向到Web应用后无法获取身份验证令牌

时间:2019-09-09 16:31:09

标签: azure azure-active-directory adal azure-java-sdk

我正在努力将Azure AD登录身份验证集成到我的Web应用程序中。我已经在azure开发门户中创建了一个帐户,并注册了我的应用程序详细信息。

我的应用网址-> https://my-sample-app/my.dashboard/

我的重定向网址是-> https://my-sample-app/my.dashboard/ws/aad/callback/

注意:我的应用程序网址后面的ws是配置的servlet适配器

我的网络应用程序是一个Java应用程序,我正在使用ADAL Java SDK

我已经参考了这篇文章Authenticate to an Azure API App from Java,并以类似的方式

这是在网络路径“ aad / callback”下编写的代码逻辑

    String appIdUri = System.getProperty("azure.app.id.uri", "https://login.microsoftonline.com/");

    String authority = System.getProperty("azure.authority.url", "https://login.microsoftonline.com/my-sample-app.onmicrosoft.com");

    String clientId = System.getProperty("azure.client.id", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

    String clientSecret = System.getProperty("azure.client.secret", "xxxxxxxxxxxxxxxxxxxxxxxx");

    AuthenticationContext context = null;

    AuthenticationResult result = null;

    ExecutorService service = null;

    UserVO userVO = null;

    try {

      HttpsURLConnection conn = (HttpsURLConnection) new URL(appIdUri).openConnection();

      service = Executors.newFixedThreadPool(1);

      context = new AuthenticationContext(authority, false, service);

      ClientCredential credential = new ClientCredential(clientId, clientSecret);

      Future<AuthenticationResult> future = context.acquireToken(appIdUri, credential, null);

      result = future.get();

      HttpSession session = request.getSession();

      LOGGER.info("session :{}",session);

      String accessToken = null;

      if (result == null) {

        throw new ServiceUnavailableException("authentication result was null");

      } else {

        accessToken = result.getAccessToken();

      }

      String data = "{\"access_token\": \"" + accessToken + "\"}";

      LOGGER.info("access_token :{}", data);

      conn.setRequestMethod("POST");

      conn.setDoOutput(true);

      conn.addRequestProperty("Content-Length", data.length() + "");

      new DataOutputStream(conn.getOutputStream()).writeBytes(data);

      String authTokenResp = IOUtils.toString(conn.getInputStream());

      Gson gson = new Gson();

      Map<String, Object> map = gson.fromJson(authTokenResp, Map.class);

      String authenticationToken = (String) map.get("authenticationToken");

      System.out.println("Authentication Token: "+authenticationToken);

我能够在日志语句中看到访问令牌的值,但是我从authTokenResp收到的authTokenResp输出值= IOUtils.toString(conn.getInputStream());看起来有些html页面(可能是portal.office.com的登录页面响应)中没有密钥authenticationToken。

我认为我为appIdUri提到了错误的URL,从而犯了错误。

请问有人可以告诉我appIdUri的URL是什么?在Azure门户中哪里可以找到该URL值?

1 个答案:

答案 0 :(得分:0)

此示例只是获取访问令牌的client credential flow

  

请问有人可以告诉我appIdUri的URL是什么?   在Azure门户中哪里可以找到该URL值?

acquireToken方法的第一个参数是您要访问的资源的值。它是目标Web API(安全资源)的App ID URI。若要查找应用程序ID URI,请在Azure门户中,依次单击“ Azure Active Directory”,“应用程序注册”,打开应用程序的“设置”页面,然后单击“属性”。它也可能是外部资源,例如https://graph.microsoft.com。授权请求或令牌请求之一都需要这样做。

my-sample-app.onmicrosoft.com是您的租户名称吗?

String authority = System.getProperty("azure.authority.url", "https://login.microsoftonline.com/{your_tenant_name}");

如果要将Azure AD登录身份验证集成到Web应用程序,则应参考this sample