第 5 章 使用 Microsoft Azure 进行身份验证
使用 Microsoft Azure 验证用户身份:
5.1. 使用 Microsoft Azure 启用身份验证 复制链接链接已复制到粘贴板!
Red Hat Developer Hub 包括一个 Microsoft Azure 身份验证供应商,可以使用 OAuth 验证用户。
先决条件
您有在 Microsoft Azure 中注册应用程序的权限。
- 您 添加了自定义 Developer Hub 应用程序配置,并有足够的权限来修改它。
流程
要允许 Developer Hub 与 Microsoft Azure 进行身份验证,请在 Microsoft Azure 中创建 OAuth 应用程序。
在 Azure 门户中 , 使用 配置创建新注册 :
- Name
- Azure 中的应用程序名称,如 < My Developer Hub>。
在 Home > App registrations > <My Developer Hub > > Manage > ; Authentication 页面中,使用以下配置添加平台 :
- 重定向 URI
-
输入 Developer Hub 中设置的后端身份验证 URI:
https:// <my_developer_hub_url> /api/auth/microsoft/handler/frame - front-channel logout URL
- 留空。
- 隐式授权和混合流
- 保留所有复选框都未清除。
在 Home > App registrations > ; <My Developer Hub > > Manage > ; API permissions 页面中,添加 Permission,然后为 Microsoft Graph API 添加以下 委派权限 :
-
email -
offline_access -
openid -
配置集 -
user.Read -
您在本节和
app-config.yamlDeveloper Hub 配置文件中定义的 Microsoft Graph API 的可选自定义范围。
-
您的公司可能需要您授予 admin 同意这些权限。即使您的公司不需要管理员同意,您可能也要这样做,因为这意味着用户在第一次访问阶段时不需要单独同意。要授予管理员同意,目录管理员必须进入管理员同意页面,然后单击 COMPANY NAME 的 Grant admin consent 。
- 在 Home > App registrations > < My Developer Hub > > Manage > Certificates & Secrets 页的 Client secrets 选项卡中,创建一个 New client secret。
保存下一步:
- 目录(租户)ID
- 应用程序(客户端)ID
应用程序(客户端)secret
要将 Microsoft Azure 凭证添加到 Developer Hub,请将以下键/值对添加到 Developer Hub secret 中:
AUTH_AZURE_TENANT_ID- 输入您保存的目录 (租户)ID。
AUTH_AZURE_CLIENT_ID- 输入您保存的 应用程序(客户端)ID。
AUTH_AZURE_CLIENT_SECRET- 输入您保存的 应用程序(客户端)secret。
在
app-config.yaml文件中设置 Microsoft Azure 身份验证供应商:app-config.yaml文件片段auth: environment: production1 providers: microsoft: production: clientId: ${AUTH_AZURE_CLIENT_ID}2 clientSecret: ${AUTH_AZURE_CLIENT_SECRET} tenantId: ${AUTH_AZURE_TENANT_ID} signInPage: microsoft3 - 1
- 将环境标记为生产环境,并在 Developer Hub 登录页面中禁用 Guest login 选项。
- 2
- 应用在 Developer Hub secret 中配置的 Microsoft Azure 凭证。
- 3
- 将 Microsoft Azure 供应商设置为 Developer Hub 登录供应商。
可选: 考虑添加以下可选字段:
domainHint可选的用于单租户应用程序。您可以通过从其他租户过滤出帐户,减少具有多个租户中帐户的登录侵权。如果要将此参数用于单租户应用,请取消注释并输入租户 ID。如果您的应用程序注册是多租户的,请将此参数留空。如需更多信息,请参阅 Home Realm Discovery。
带有可选
domainHint字段的app-config.yaml文件片段auth: environment: production providers: microsoft: production: domainHint: ${AUTH_AZURE_TENANT_ID}additionalScopes可选用于其他范围。要为应用程序注册添加范围,取消注释并输入您要添加的范围列表。default 和 mandatory 值 list:
'openid', 'offline_access', 'profile', 'email', 'User.Read'.带有可选
additionalScopes字段的app-config.yaml文件片段auth: environment: production providers: microsoft: production: additionalScopes: - Mail.SendsessionDuration用户会话的寿命。以
ms库格式输入持续时间(如 '24h'、'2 days')、ISO 持续时间或 "human duration",如代码中使用的。带有可选
sessionDuration字段的app-config-rhdh.yaml片段auth: providers: microsoft: production: sessionDuration: { hours: 24 }signIn解析器-
身份验证成功后,中的用户签名必须解析为 Developer Hub 目录中的现有用户。为了更好地为您的用例安全地匹配用户,请考虑配置特定的解析器。输入解析器列表以覆盖默认解析器:
emailLocalPartMatchingUserEntityName。
身份验证提供程序尝试每个登录解析器按顺序尝试,直到成功为止,如果没有成功,则失败。
警告在 production 模式中,只配置一个解析器以确保用户被安全地匹配。
resolver输入登录解析器名称。可用的解析器:
-
userIdMatchingUserEntityAnnotation -
emailLocalPartMatchingUserEntityName -
emailMatchingUserEntityProfileEmail
-
dangerouslyAllowSignInWithoutUserInCatalog: true配置登录解析器以绕过 Developer Hub 软件目录中的用户置备要求。
警告使用
dangerouslyAllowSignInWithoutUserInCatalog探索 Developer Hub 功能,但不要在生产环境中使用它。带有可选字段的
app-config-rhdh.yaml片段,允许软件目录中缺少的用户签名auth: environment: production providers: microsoft: production: clientId: ${AUTH_AZURE_CLIENT_ID} clientSecret: ${AUTH_AZURE_CLIENT_SECRET} tenantId: ${AUTH_AZURE_TENANT_ID} signIn: resolvers: - resolver: usernameMatchingUserEntityName dangerouslyAllowSignInWithoutUserInCatalog: true signInPage: microsoft
注意对于具有传出访问限制的环境,此步骤是可选的,如防火墙规则。如果您的环境有这种限制,请确保您的 RHDH 后端可以访问以下主机:
-
login.microsoftonline.com:用于获取和交换授权代码和访问令牌。 -
graph.microsoft.com:用于检索用户配置文件信息(如源代码中引用)。如果这个主机无法访问,您可能会看到 Authentication failed,在尝试登录时无法获取用户配置集 错误。
= 从 Microsoft Azure 置备用户到软件目录
要使用 Microsoft Azure 验证用户身份,请在使用 Microsoft Azure 启用身份验证 后,将用户从 Microsoft Azure 置备到 Developer Hub 软件目录。
先决条件
- 您已使用 Microsoft Azure 启用身份验证。
流程
-
要启用 Microsoft Azure 成员发现,请编辑自定义 Developer Hub ConfigMap,如
app-config-rhdh,并将以下行添加到app-config.yaml内容中:
catalog:
providers:
microsoftGraphOrg:
providerId:
target: https://graph.microsoft.com/v1.0
tenantId: ${AUTH_AZURE_TENANT_ID}
clientId: ${AUTH_AZURE_CLIENT_ID}
clientSecret: ${AUTH_AZURE_CLIENT_SECRET}
目标 :https://graph.microsoft.com/v1.0- 定义提供程序所连接的 MSGraph API 端点。您可以更改此参数,以使用不同的版本,如 beta 端点。
tenandId,clientId和clientSecret- 使用您在 Microsoft Azure 中创建的 Developer Hub 应用程序信息,并在 OpenShift 中配置为 secret。
可选: 考虑添加以下 microsoftGraphOrg.providerId 字段:
authority: https://login.microsoftonline.com定义所用的授权。更改该值以使用其他授权机构 , 如 Azure US government。默认值
:https://login.microsoftonline.com。带有可选
queryMode字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: authority: https://login.microsoftonline.com/
queryMode: basic | advanced默认情况下,Microsoft Graph API 只提供
用于查询的基本功能集。某些功能需要高级查询功能。请参阅 Microsoft Azure 高级查询。带有可选
queryMode字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: queryMode: advanced
user.expand要在结果中包含单一关系(navigation 属性)引用的扩展资源或集合。在一个请求中只能扩展一个关系。请参阅 Microsoft Graph query expand parameter。这个参数可以与 ] 或 xref:userFilter[ 结合使用。
带有可选
user.expand字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: user: expand: manager
user.filter过滤用户。请参阅 Microsoft Graph API 和 Microsoft Graph API 查询过滤器参数语法。这个参数和 ???TITLE??? 是相互排斥的,只能指定一个。
带有可选
user.filter字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: user: filter: accountEnabled eq true and userType eq 'member'
user.loadPhotos: true | false默认加载照片。设置为
false以不加载用户 photos。带有可选
user.loadPhotos字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: user: loadPhotos: true
user.select定义要检索的 Microsoft Graph 资源类型。
带有可选
user.select字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: user: select: ['id', 'displayName', 'description']
userGroupMember.filter使用组成员资格来获取用户。过滤组并获取其成员。这个参数和 ???TITLE??? 是相互排斥的,只能指定一个。
app-config.yamlfragment with optionaluserGroupMember.filterfieldcatalog: providers: microsoftGraphOrg: providerId: userGroupMember: filter: "displayName eq 'Backstage Users'"
userGroupMember.search使用组成员资格来获取用户。搜索组并获取其成员。这个参数和 ???TITLE??? 是相互排斥的,只能指定一个。
app-config.yamlfragment with optionaluserGroupMember.searchfieldcatalog: providers: microsoftGraphOrg: providerId: userGroupMember: search: '"description:One" AND ("displayName:Video" OR "displayName:Drive")'
group.expand可选参数,在结果中包含单一关系(navigation 属性)引用的扩展资源或集合。在一个请求中只能扩展一个关系。请参阅 https://docs.microsoft.com/en-us/graph/query-parameters#expand-parameter 这个参数与 ] 而不是 xref:userFilter[ 结合使用。
带有可选
group.expand字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: group: expand: member
group.filter过滤组。请参阅 Microsoft Graph API 查询组语法。
带有可选
group.filter字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: group: filter: securityEnabled eq false and mailEnabled eq true and groupTypes/any(c:c+eq+'Unified')
group.search搜索组。请参阅 Microsoft Graph API 查询搜索参数。
带有可选
group.search字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: group: search: '"description:One" AND ("displayName:Video" OR "displayName:Drive")'
group.select要定义要检索的 Microsoft Graph 资源类型。
带有可选
group.select字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: group: select: ['id', 'displayName', 'description']schedule.frequency指定自定义调度频率。支持代码中使用的 cron、ISO 持续时间和"human 持续时间"。
带有可选
schedule.frequency字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: schedule: frequency: { hours: 1 }schedule.timeout指定自定义超时。支持代码中使用的 ISO 持续时间和"human duration"。
带有可选
schedule.timeout字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: schedule: timeout: { minutes: 50 }schedule.initialDelay指定自定义初始延迟。支持代码中使用的 ISO 持续时间和"human duration"。
带有可选
schedule.initialDelay字段的app-config.yaml片段catalog: providers: microsoftGraphOrg: providerId: schedule: initialDelay: { seconds: 15}
验证
检查控制台日志,以验证同步是否已完成。
成功同步示例:
backend:start: {"class":"MicrosoftGraphOrgEntityProvider$1","level":"info","message":"Read 1 msgraph users and 1 msgraph groups in 2.2 seconds. Committing...","plugin":"catalog","service":"backstage","taskId":"MicrosoftGraphOrgEntityProvider:default:refresh","taskInstanceId":"88a67ce1-c466-41a4-9760-825e16b946be","timestamp":"2024-06-26 12:23:42"} backend:start: {"class":"MicrosoftGraphOrgEntityProvider$1","level":"info","message":"Committed 1 msgraph users and 1 msgraph groups in 0.0 seconds.","plugin":"catalog","service":"backstage","taskId":"MicrosoftGraphOrgEntityProvider:default:refresh","taskInstanceId":"88a67ce1-c466-41a4-9760-825e16b946be","timestamp":"2024-06-26 12:23:42"}- 使用 Microsoft Azure 帐户登录。