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

Unable to get the authentication token after redirecting to web app

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

我的应用程序 URL -> https://my-sample-app/my.dashboard/

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

注意:在我的应用 url 之后出现的 ws 是配置的 servlet 适配器

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

我参考了这篇文章 并采用了类似的方式

这是web路径下写的代码逻辑"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 吗?我在哪里可以找到这个 URL Azure 门户中的值?

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

please can i someone tell me what URL should be given for appIdUri ? where can i find this URL value in azure portal ?

acquireToken 方法的第一个参数是您想要的资源的值 access.It 是目标网站的 App ID URI API(受保护的资源)。要查找 App 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