本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 AWS Blu Age 的现代化大型机应用程序中实施基于 Microsoft Entra ID 的身份验证
Vishal Jaswani 和 Rimpy Tewani,Amazon Web Services
Summary
注意
AWS Mainframe Modernization 服务(托管运行时环境体验)不再向新客户开放。要获得与 AWS Mainframe Modernization 服务(托管运行时环境体验)类似的功能,请浏览 AWS Mainframe Modernization 服务(自我管理体验)。现有客户可以继续正常使用该服务。有关更多信息,请参阅 AWS Mainframe Modernization 可用性变更。
使用重构模式进行现代化改造的大型机应用程序,例如使用 AWS Blu Age AWS Mainframe Modernization 重构的应用程序,需要将身份验证机制仔细集成到新的应用程序架构中。这种集成通常会被称为现代化后的活动。这项任务可能很复杂,且通常涉及现有身份验证系统的迁移或外部化,以符合现代安全标准和云原生实践。开发人员需要考虑如何在现代化应用程序的运行时环境和库的约束下有效实施身份验证。现代化后, AWS 提供了一些方法可以让你更轻松地将 AWS Blu Age 现代代码与身份和访问管理系统(例如 Amazon Cognito 和 Microsoft En tra ID
此模式说明了当身份验证提供者是 Microsoft Entra ID 时,如何在现代化应用程序中实施身份验证机制,而无需花时间进行研究和试验。此模式提供:
经过现场测试的相关 Angular 库,这些哭均来自 Microsoft Authentication Library(MSAL)和其他对身份验证实施至关重要的 Microsoft Entra ID 文档。
使用 OAuth 2.0 启用 Spring Security 需要在 AWS Blu Age 运行时进行配置。
一个库,用于捕获经过身份验证的用户的身份并将其传递给 AWS Blu Age Runtime。
我们建议实施的安全措施。
Microsoft Entra ID 设置中常见问题的排查提示。
注意
此模式使用 AWS Blu A OAuth ge 扩展库,该库作为客户AWS 专业服务
先决条件和限制
先决条件
限制
此模式涵盖了 OAuth 2.0 身份验证和基于令牌的基本授权流程。高级授权场景和精细访问控制机制不在此范围内。
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按区域划分的AWS 服务
。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。
产品版本
开发此模式使用了以下工具:
AWS Blu Age Runtime 版本 4.1.0(该模式也适用于向后兼容的更高版本)
MSAL 库版本 3.0.23
Java 开发工具包(JDK)版本 17
Angular 版本 16.1
架构
源技术堆栈
在典型的大型机环境中,可通过用户配置文件来实施身份验证。这些配置文件可识别系统的用户,定义可登录系统的人员,并指定用户可以对系统资源执行哪些函数。用户配置文件由安全人员或安全管理员管理。
目标技术堆栈
Microsoft Entra ID
基于 Java Spring Boot 的现代化后端
AWS 蓝光时代运行时间
OAuth 2.0 的春季安全
Angular 单页应用程序(SPA)
目标架构
AWS 默认情况下,Blu Age 运行时支持 OAuth 基于 2.0 的身份验证,因此该模式使用该标准来保护后端。 APIs
下图阐明了该流程。
注意
此图使用 Amazon Aurora 作为数据库现代化的示例,尽管 Aurora 未包含在此模式的步骤中。

其中:
用户尝试使用 Microsoft Entra ID 进行身份验证。
Microsoft Entra ID 返回应用程序在后续调用中使用的刷新、访问和 ID 令牌。
MSAL 拦截器在调用 AWS Blu Age Runtime 的 HTTPS 请求
Authorization标头中包含访问令牌。AWS Blu Age
extension-oauth库使用 Bl AWS u Age Runtime 配置文件 (application-main.yml) 从标题中提取用户信息,并将这些信息放在SharedContext对象中,以便业务逻辑可以消耗这些信息。注意
SharedContext是 AWS Blu Age 提供的运行时组件,用于管理现代化应用程序中的应用程序上下文和状态信息。有关 AWS Blu Age 运行时组件和更新的更多信息,请参阅 AWS Mainframe Modernization 文档中的 AWS Blu Age 发行说明。有关该application-main.yml文件的更多信息,请参阅 AWS Mainframe Modernization 文档中的为 AWS Blu Age Runtime 设置配置。AWS Blu Age 运行时会检查令牌是否存在。
如果该令牌存在,则会通过与 Microsoft Entra ID 通信来检查令牌的有效性。
如果令牌不存在, AWS Blu Age Runtime 将返回错误,HTTP 状态码为 403。
如果令牌有效,则 AWS Blue Age Runtime 允许业务逻辑继续运行。如果令牌无效, AWS Blu Age Runtime 将返回错误,HTTP 状态码为 403。
OAuth 2.0 工作流程
有关 OAuth 2.0 工作流程的高级示意图,请参阅 Microsoft Entra 文档
工具
AWS 服务
AWS Mainframe Modernization提供工具和资源,帮助您规划和实施从大型机到 AWS 托管运行时环境的迁移和现代化。您可以使用 AWS Blu Age 提供的此服务的重构功能对您的传统大型机应用程序进行转换和现代化改造。
注意
AWS Mainframe Modernization 服务(托管运行时环境体验)不再向新客户开放。要获得与 AWS Mainframe Modernization 服务(托管运行时环境体验)类似的功能,请浏览 AWS Mainframe Modernization 服务(自我管理体验)。现有客户可以继续正常使用该服务。有关更多信息,请参阅 AWS Mainframe Modernization 可用性变更。
代码存储库
该 CardDemo 应用程序已更新,以演示与微软 Entra ID 的集成。您可以从GitHub 存储库中访问此模式的
后端配置
此模式需要更改application-main.yml配置文件才能通过在后端应用程序上使用 OAuth 2.0 来启用 Spring Security。 .yml 文件如下所示:
gapwalk-application.security: enabled gapwalk-application: security: identity: oauth issuerUri: ${issuerUrl} claim: claims: - claimName: upn claimMapValue: username spring: autoconfigure: exclude: - org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration - org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration security: oauth2: client: registration: azure: client-id: {clientId} client-secret: ${clientSecret} provider: azure authorization-grant-type: authorization_code redirect-uri: ${redirectUri} scope: openid provider: azure: authorization-uri: ${gapwalk-application.security.issuerUri}/oauth2/v2.0/authorize token-uri: ${gapwalk-application.security.issuerUri}/oauth2/v2.0/token jwk-set-uri: ${gapwalk-application.security.issuerUri}/discovery/v2.0/keys resourceserver: jwt: jwk-set-uri: ${gapwalk-application.security.issuerUri}/discovery/v2.0/keys
AWS Blu Age OAuth 扩展滤镜库
AWS Blu A OAuth ge 扩展库由 AWS Blu Age 团队在您使用AWS 专业服务
该库会读取上一个代码块中显示的 application-main.yml 文件中的 claim.claims 配置。此配置是一个列表。列表中的每个项目都会提供两个值:claimName 和 claimMapValue。claimName 表示前端发送的 JSON Web 令牌(JWT)中的键名,并且 claimMapValue 也是 SharedContext 中的键名。例如,如果要在后端捕获用户 ID,请将 claimName 设置为 JWT 中保存 Microsoft Entra ID 提供的 userId 的键名,然后将 claimMapValue 设置为键名,以在后端代码中获取用户 ID。
例如,如果您在 claimMapValue 中设置了 UserId,则可以使用以下代码提取用户 ID:
SharedContext.get().getValue("userId", [UserId]);
最佳实践
在实施此模式时,请考虑以下重要的安全注意事项。
重要
此模式为身份验证集成提供了基础。我们建议您,除了本部分中讨论的措施外,还应根据您的业务需求实施安全措施,然后再将其部署到生产环境。
AWS 配置安全。将敏感配置值从移
application-main.yml至 AWS Secrets Manager。例如,使用 Secrets Manager 配置以下属性:security: oauth2: client: registration: azure: client-id: {clientId} client-secret: ${clientSecret}有关如何使用 Secrets Manager 配置 AWS Blu Age 参数的更多信息,请参阅 AWS Mainframe Modernization 文档中的 AWS Blu Age 运行时密钥。
运行时环境保护。使用适当的 AWS 安全控制来配置现代化的应用程序环境:
server: tomcat: remoteip: protocol-header: X-Forwarded-Proto remote-ip-header: X-Forwarded-For forward-headers-strategy: NATIVE亚马逊 CloudWatch 日志。考虑添加文件
logback-spring.xml to src/main/resources:<configuration> <appender name="CLOUDWATCH" class="com.amazonaws.services.logs.logback.CloudWatchAppender"> <logGroup>/aws/bluage/application</logGroup> <logStream>${AWS_REGION}-${ENVIRONMENT}</logStream> <layout> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </layout> </appender> <root level="INFO"> <appender-ref ref="CLOUDWATCH"/> </root> </configuration>有关使用启用跟踪的信息 CloudWatch,请参阅 CloudWatch 文档中的启用跟踪以记录关联。
令牌配置和处理。在 Microsoft Entra ID 中配置令牌生命周期,以符合您的安全要求。将访问令牌设置为 1 小时内到期,将刷新令牌设置为 24 小时内到期。在 AWS Blu Age 运行时配置 (
application-main.yml) 中,确保使用您的 Entra ID 应用程序注册中确切的颁发者 URI 和受众值正确配置 JWT 验证。当令牌到期并刷新时:
Angular 应用程序的错误拦截器会通过 MSAL 获取新令牌,进而处理 401 响应。
新令牌会与后续请求一起发送。
AWS Blu Age Runtime 的 OAuth 过滤器会验证新令牌,并
SharedContext使用当前用户信息自动更新。这可确保业务逻辑能够通过SharedContext.get().getValue()调用继续访问有效的用户上下文。
有关 AWS Blu Age Runtime 组件及其更新的更多信息,请参阅 AWS Blu Age 发行说明。
AWS Blu Age 运行时安全。 AWS Blu Age 提供的
oauth2-ext库必须放置在正确的共享目录位置 ({app-server-home}/shared/) 中,并具有适当的文件权限。 JWTs 通过检查日志中的SharedContext对象群来验证库是否成功地从中提取了用户信息。具体的声明配置。在
application-main.yml中,明确定义您需要从 Microsoft Entra ID 中获得的声明。例如,要捕获用户的电子邮件和角色,请指定:gapwalk-application: security: claim: claims: - claimName: upn claimMapValue: username - claimName: roles claimMapValue: userRoles - claimName: email claimMapValue: userEmail错误处理。添加错误处理,以处理 Angular 应用程序中的身份验证失败;例如:
@Injectable() export class AuthErrorInterceptor implements HttpInterceptor { intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(request).pipe( catchError((error: HttpErrorResponse) => { if (error.status === 401) { // Handle token expiration this.authService.login(); } if (error.status === 403) { // Handle unauthorized access this.router.navigate(['/unauthorized']); } return throwError(() => error); }) ); } }会话超时配置。在 AWS Blu Age 运行时和 Microsoft Entra ID 中配置会话超时设置。例如,将以下代码添加到您的
application-main.yml文件:server: servlet: session: timeout: 3600 # 1 hour in secondsMsalGuard。 您必须为所有受保护的路由实现该 MsalGuard 功能,以防止未经授权的访问。例如:
const routes: Routes = [ { path: '', redirectTo: '/transaction-runner', pathMatch: 'full' }, { path: 'transaction-runner', component: TransactionRunnerComponent, canActivate:guards }, { path: 'user-info', component: UserInfoComponent, canActivate:guards }, { path: 'term/:transid/:commarea', component: TermComponent, canActivate:guards }, { path: 'code', component: TransactionRunnerComponent } ];没有 MsalGuard 保护的路由无需身份验证即可访问,这可能会暴露敏感功能。确认所有需要身份验证的路由的配置中都已包含防护。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
设置 Microsoft Azure 账户以创建 Entra ID。 | 有关选项和说明,请访问 Microsoft Azure 网站 | 应用程序开发人员 |
在您的应用程序中,设置 Microsoft Entra ID。 | 要了解如何将 Microsoft Entra ID B2C(Azure AD B2C)身份验证添加到 Angular SPA,请参阅 Microsoft 文档
| 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
克隆 GitHub 存储库以获取身份验证所需的 Angular 代码。 | 运行以下命令,将此模式提供的GitHub 存储库
| 应用程序开发人员 |
在 Tomcat 服务器上部署 AWS Blu Age 现代化代码以实现身份验证。 | 要设置包括 Tomcat 和 Angular 开发服务器在内的本地环境,请按照 AWS Blu Age 团队提供的安装步骤进行操作,这是客户参与 AWS 专业服务的一部分。 | 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
启用 AWS Blu Age 运行时安全,以保护 AWS Blu Age REST API 端点。 | 按如下方式配置 AWS Blu Age 运行时使用的
| 应用程序开发人员 |
将本地环境中的示例代码整合到您的 Blu Age 现代化 Angular 代码库中。 | 有关如何将该示例整合到您的 AWS Blu Age 现代化 Angular 代码库中的信息,请参阅本模式前面的 “代码存储库” 部分。 | 应用程序开发人员 |
将 | 将
| 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
部署前端应用程序。 | 允许以下命令,在本地启动前端应用程序:
注意在 | 应用程序开发人员 |
启动后端应用程序。 | 在 Eclipse 中启动 Tomcat 服务器。 | 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
测试登录功能。 | 访问本地部署的应用程序( 注意此处使用 HTTP 仅为演示目的。在生产环境或其他可公开访问的环境中,出于安全考虑,您必须使用 HTTPS。即使对于本地开发,我们也建议您尽可能设置 HTTPS。 应该会出现 Microsoft 登录提示,并且应该允许在 Microsoft Entra ID 中配置的用户访问该应用程序。 | 应用程序开发人员 |
测试请求中的授权标头。 | 注意以下步骤以该CardDemo
| 应用程序开发人员 |
测试注销功能。 | 选择退出以注销,然后尝试再次访问该应用程序。此时应该会显示一个新的登录提示。 | 应用程序开发人员 |
问题排查
| 问题 | 解决方案 |
|---|---|
微软 Entra ID 发行的令牌与 Spring Boot OAuth 2.0 安全性不兼容。 | 有关该问题的解决方案,请参阅 OAuth 博客上的 Microsoft Entra ID OAuth Flow |
与令牌相关的一般问题。 | 要解码和查看 JWT 令牌的内容,请使用 https://jwt.io/ |
相关资源
有关使用 AWS Blu Age 重构应用程序的信息,请参阅文档。AWS Mainframe Modernization
要了解 OAuth 2.0 的工作原理,请访问 OAuth 2.0 网站
。 有关微软身份验证库(MSAL)的概述,请参阅 Microsoft Entra 文档
。 有关 AS/400 系统上用户配置文件的信息,请参阅 IBM i (AS400)
教程。 有关微软身份平台中的 OAuth 2.0 和 OpenID Connect (OIDC) 身份验证流程,请参阅微软 Entra 文档。