使用 Microsoft Entra ID 为 Java WebLogic 应用启用登录
本文演示了一个 Java WebLogic 应用,它可使用适用于 Java 的 Microsoft 身份验证库 (MSAL) 将用户登录到 Microsoft Entra ID 租户。
下图显示了应用的拓扑结构:
客户端应用使用 MSAL for Java (MSAL4J) 将用户登录到它们自己的 Microsoft Entra ID 租户,并从 Microsoft Entra ID 获取 ID 令牌。 ID 令牌证明用户已通过此租户的身份验证。 应用会根据用户的身份验证状态保护其路由。
先决条件
- JDK 版本 8 或更高版本
- Maven 3
- Microsoft Entra ID 租户。 有关详细信息,请参阅如何获取 Microsoft Entra ID 租户。
- 如果只想使用组织目录中的帐户,即单租户模式,则使用自己的 Microsoft Entra ID 租户中的用户帐户。 如果尚未在 Microsoft Entra ID 租户中创建用户帐户,则应在继续操作前创建一个帐户。 有关详细信息,请参阅如何创建、邀请和删除用户。
- 如果要使用任何组织目录中的帐户,即在多租户模式下,则需要任何组织的 Microsoft Entra ID 租户中的用户帐户。 必须修改此示例才能使用个人 Microsoft 帐户。 如果还没有在 Microsoft Entra ID 租户中创建用户帐户,则应在继续操作前创建一个帐户。 有关详细信息,请参阅如何创建、邀请和删除用户。
- 个人 Microsoft 帐户,例如 Xbox、Hotmail、Live 等 - 如果想使用个人 Microsoft 帐户。
建议
- 熟悉一下 Java / Jakarta Servlets。
- 熟悉一下 Linux/OSX 终端。
- 用于检查令牌的 jwt.ms。
- 用于监控网络活动和故障排除的 Fiddler。
- 关注 Microsoft Entra ID 博客,了解最新进展情况。
设置示例
以下各部分将介绍如何设置示例应用程序。
克隆或下载示例存储库
要克隆示例,请打开 Bash 窗口并使用以下命令:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/1-Authentication/sign-in
或者,导航到 ms-identity-msal-java-samples 存储库,然后将其作为 .zip 文件下载并提取到硬盘驱动器。
重要
为避免 Windows 系统对文件路径长度的限制,请将存储库克隆提取到硬盘驱动器根目录附近。
使用 Microsoft Entra ID 租户注册示例应用程序
此示例中有一个项目。 本部分将介绍如何注册应用程序。
首先,按照快速入门:将应用程序注册到 Microsoft 标识平台中的说明在 Azure 门户中注册应用。
然后,按照以下步骤完成注册:
导航到面向开发人员的 Microsoft 标识平台应用注册页。
选择新注册。
在出现的“注册应用程序”页面中,输入以下应用程序注册的信息:
在“名称”部分中,输入一个有意义的应用名称,以便向应用用户显示,例如 。
java-servlet-webapp-authentication
在“支持的帐户类型”下,选择以下选项之一:
- 如果生成的应用程序仅供租户中的用户使用,即单租户应用程序,请选择“仅限此组织目录中的帐户”。
- 如果希望任何 Microsoft Entra ID 租户中的用户都能使用应用程序(即多租户应用程序),请选择“任何组织目录中的帐户”。
- 选择“任何组织目录中的帐户和 Microsoft 个人帐户”以包含最广泛的客户,即同时支持 Microsoft 个人帐户的多租户应用程序。
- 选择“Microsoft 个人帐户”,仅供 Microsoft 个人帐户(例如 Hotmail、Live、Skype 和 Xbox 帐户)用户使用。
在“重定向 URI”部分中,在组合框中选择“Web”并输入以下重定向 URI:。
http://localhost:8080/msal4j-servlet-auth/auth/redirect
选择“注册”以创建应用程序。
在应用的注册页面上,找到并复制“应用程序(客户端) ID”值,以供稍后使用。 可以在应用程序的一个或多个配置文件中使用此值。
在应用的注册页面上,选择导航窗格中的“证书和机密”,打开可生成机密和上传证书的页面。
在“客户端密码”部分中,选择“新建客户端密码”。
键入描述,例如“应用机密”。
从可用期限中选择一个:“1 年内”、“2 年内”或“永不过期”。
选择 添加 。 此时将显示生成的值。
复制并保存生成的值,以供在之后的步骤中使用。 代码的配置文件需要使用此值。 此值不会再显示,也无法通过任何其他方式获取。 因此,在导航到任何其他屏幕或窗格之前,请务必从 Azure 门户保存该值。
将应用配置为使用应用注册
按照以下步骤来配置应用:
注意
在以下步骤中,ClientID
与 Application ID
或 AppId
相同。
在 IDE 中打开项目。
打开 ./src/main/resources/authentication.properties 文件。
找到字符串
{enter-your-tenant-id-here}
。 使用以下值之一替换现有值:- Microsoft Entra ID 租户 ID(如果使用“仅限本组织目录中的账户”选项注册应用)。
- 如果使用“任何组织目录中的帐户”选项来注册应用程序,则显示
organizations
字样。 - 如果使用“任何组织目录中的帐户和个人 Microsoft 帐户”选项来注册应用程序,则显示
common
字样。 - 如果使用“个人 Microsoft 帐户”选项来注册应用,则显示
consumers
字样。
找到字符串
{enter-your-client-id-here}
,然后用从 Azure 门户复制的应用程序 ID 或clientId
应用程序的java-servlet-webapp-authentication
来替换现有值。在 Azure 门户中查找字符串
{enter-your-client-secret-here}
,并将现有值替换为在创建java-servlet-webapp-authentication
应用时保存的值。
生成示例
要使用 Maven 生成示例,请导航到包含示例的 pom.xml 文件的目录,然后运行以下命令:
mvn clean package
此命令会生成一个 .war 文件,它可以在各种应用服务器上运行。
部署示例
这些说明假定安装了 WebLogic 并设置了某个服务器域。
在部署到 WebLogic 之前,请按照以下步骤对示例本身进行一些配置更改,然后生成或重新生成包:
在示例中,找到在其中配置了客户端 ID、租户、重定向 URL 等的 application.properties 或 authentication.properties 文件。
在此文件中,将对
localhost:8080
或localhost:8443
的引用更改为 WebLogic 运行的 URL 和端口,而默认情况下它应该是localhost:7001
。还需要在 Azure 应用注册中进行相同的更改,即在 Azure 门户中将其设置为“身份验证”选项卡上的“重定向 URI”值。
使用以下步骤通过 Web 控制台将样本部署到 WebLogic:
使用 DOMAIN_NAME\bin\startWebLogic.cmd 启动 WebLogic 服务器。
在浏览器中导航到 WebLogic 网络控制台,网址为
http://localhost:7001/console
。转到域结构>部署,选择“安装”,选择“上传文件”,然后找到使用 Maven 生成的 .war 文件。
选择“作为应用程序安装此部署”,选择“下一步”,选择“完成”,然后选择“保存”。
大部分的默认设置都可以保留,但应用程序名称除外,应将其与在示例配置或 Azure 应用程序注册中设置的重定向 URI 一致。 也就是说,如果重定向 URI 是
http://localhost:7001/msal4j-servlet-auth
,则应将应用程序命名为msal4j-servlet-auth
。返回到域结构>部署,然后启动应用程序。
在应用程序启动后,导航至
http://localhost:7001/<application-name>/
,这样就能访问应用程序了。
探索示例
按照以下步骤来探索示例:
- 注意屏幕中央显示的登录或退出状态。
- 选择角落里的上下文相关按钮。 首次运行应用时,此按钮显示“登录”。
- 在下一页上,按照说明使用 Microsoft Entra ID 租户中的帐户登录。
- 在同意屏幕上,请注意正在请求的范围。
- 请注意,上下文相关按钮现在显示“注销”并显示你的用户名。
- 选择“ID 令牌详细信息”以查看一些 ID 令牌的解码声明。
- 使用角落里的按钮注销。
- 注销后,选择“ID 令牌详细信息”,观察应用程序是否会在用户未获授权时显示 错误,而不是 ID 令牌声明。
401: unauthorized
关于代码
本示例展示了如何使用适用于 Java 的 MSAL (MSAL4J) 将用户登录到 Microsoft Entra ID 租户。 如果要在自己的应用程序中使用 MSAL4J,则必须使用 Maven 将其添加到项目中。
如果要复制此示例的行为,则可以复制 src/main/java/com/microsoft/azuresamples/msal4j 文件夹中的 pom.xml 文件以及 helpers 和 authservlets 文件夹的内容。 还需要使用 authentication.properties 文件。 这些类和文件包含通用代码,可用于各种应用程序。 也可以复制示例的其他部分,但其他类和文件是专门为实现本示例的目标而生成的。
目录
下表列出了示例项目文件夹的内容:
文件/文件夹 | 说明 |
---|---|
src/main/java/com/microsoft/azuresamples/msal4j/authwebapp/ | 此目录包含定义应用的后端业务逻辑的类。 |
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | 此目录包含用于登录和注销终结点的类。 |
*Servlet.java | 所有可用的终结点都在 Java 类中定义,名称以 Servlet 结尾。 |
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | 用于身份验证的帮助程序类。 |
AuthenticationFilter.java | 将对受保护终结点未经身份验证的请求重定向到 401 页面。 |
src/main/resources/authentication.properties | Microsoft Entra ID 和程序配置。 |
src/main/webapp/ | 此目录包含 UI - JSP 模板 |
CHANGELOG.md | 示例更改的列表。 |
CONTRIBUTING.md | 参与示例的指南。 |
许可证 | 示例的许可证。 |
ConfidentialClientApplication
如下例所示,在 ConfidentialClientApplication
文件中创建了一个 实例。 此对象有助于创建 Microsoft Entra ID 授权 URL,还有助于将身份验证令牌交换为访问令牌。
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
以下参数用于实例化:
- 应用的客户端 ID。
- 客户端机密,这是机密客户端应用程序的要求。
- Microsoft Entra ID 颁发机构,其中包括 Microsoft Entra ID 租户 ID。
在本示例中,这些值是使用 Config.java 文件中的属性阅读器从 authentication.properties 文件读取的。
分步演练
以下步骤介绍了该应用的功能:
登录过程的第一步是向 Microsoft Entra ID 租户的
/authorize
终结点发送请求。 MSAL4JConfidentialClientApplication
实例用于构建授权请求 URL。 应用会将浏览器重定向到此 URL,即用户登录的 URL。final ConfidentialClientApplication client = getConfidentialClientInstance(); AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES)) .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build(); final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString(); contextAdapter.redirectUser(authorizeUrl);
下面列出了该代码的功能:
AuthorizationRequestUrlParameters
:生成 AuthorizationRequestUrl 时必须设置的参数。REDIRECT_URI
:Microsoft Entra ID 在收集用户凭据后会将浏览器以及授权码重定向到哪里。 它必须与 Azure 门户中 Microsoft Entra ID 应用注册的重定向 URI 相匹配。SCOPES
:范围是应用程序请求的权限。 通常,三个范围openid profile offline_access
就足以接收 ID 令牌响应。可以在 authentication.properties 文件中找到应用请求的范围的完整列表。 可以添加更多范围,如
User.Read
。
Microsoft Entra ID 将会向用户显示登录提示。 如果登录尝试成功,用户的浏览器就会重定向到应用的重定向终结点。 向此终结点发出的有效请求包含授权代码。
然后,
ConfidentialClientApplication
实例会将此授权代码与 Microsoft Entra ID 的 ID 令牌和访问令牌进行交换。// First, validate the state, then parse any error codes in response, then extract the authCode. Then: // build the auth code params: final AuthorizationCodeParameters authParams = AuthorizationCodeParameters .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build(); // Get a client instance and leverage it to acquire the token: final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance(); final IAuthenticationResult result = client.acquireToken(authParams).get();
下面列出了该代码的功能:
AuthorizationCodeParameters
:为交换 ID 和/或访问令牌的授权代码而必须设置的参数。authCode
:在重定向终结点收到的授权代码。REDIRECT_URI
:必须再次传递上一步中使用的重定向 URI。SCOPES
:必须再次传递上一步中使用的范围。
如果
acquireToken
成功,则提取令牌声明。 如果 nonce 检查通过,结果将被放入context
-IdentityContextData
的一个实例,并会被保存到会话中。 然后,当应用程序需要访问IdentityContextData
时,就可以通过IdentityContextAdapterServlet
的实例从会话中将其实例化,如以下代码所示:// parse IdToken claims from the IAuthenticationResult: // (the next step - validateNonce - requires parsed claims) context.setIdTokenClaims(result.idToken()); // if nonce is invalid, stop immediately! this could be a token replay! // if validation fails, throws exception and cancels auth: validateNonce(context); // set user to authenticated: context.setAuthResult(result, client.tokenCache().serialize());
保护路由
有关示例应用如何筛选路由访问的信息,请参阅 AuthenticationFilter.java。 在 authentication.properties 文件中,app.protect.authenticated
属性包含只有通过身份验证的用户才能访问的以逗号分隔的路由,如下例所示:
# for example, /token_details requires any user to be signed in and does not require special roles claim(s)
app.protect.authenticated=/token_details
作用域
范围表明了 Microsoft Entra ID 应用程序请求的访问级别。
根据请求的范围,Microsoft Entra ID 会在登录时向用户显示同意对话。 如果用户同意一个或多个范围并获得了一个令牌,则同意的范围将被编码到生成的 access_token
中。
有关应用程序请求的范围,请参阅 authentication.properties。 这三个范围由 MSAL 请求,默认情况下由 Microsoft Entra ID 提供。
详细信息
- 适用于 Java 的 Microsoft 身份验证库 (MSAL)
- MSAL Java 参考文档
- Microsoft 标识平台(针对开发人员的 Microsoft Entra ID)
- 快速入门:将应用程序注册到 Microsoft 标识平台
- 了解 Microsoft Entra ID 应用程序同意体验
- 了解用户同意和管理员同意
- MSAL 代码示例