错误:“当前时间早于 NotBefore 条件”
当 IdP 与 GitHub 之间的时间差太大时可能会发生此错误,这通常发生在自托管 IdP 中。
如果遇到此错误,请确保 IdP 上的时间与 NTP 服务器正确同步。
如果使用 ADFS 作为 IdP,则对于 GitHub,也将 ADFS 中的 NotBeforeSkew
设置为 1 分钟。 如果 NotBeforeSkew
设置为 0,即使非常小的时间差(包括几毫秒)也会导致身份验证问题。
用户反复重定向到身份验证
如果在循环中反复将用户重定向到 SAML 身份验证提示,则可能需要在 IdP 设置中增加 SAML 会话持续时间。
SAML 响应中发送的 SessionNotOnOrAfter
值决定何时将用户重定向回 IdP 进行身份验证。 如果 SAML 会话持续时间配置为 2 小时或更短,GitHub 将在 SAML 会话过期前 5 分钟刷新它。 如果会话持续时间配置为 5 分钟或更短,则用户可能会卡在 SAML 身份验证循环中。
若要解决此问题,建议将 SAML 会话的最短持续时间配置为 4 小时。 有关详细信息,请参阅“SAML 配置参考”。
某些用户未由 SCIM 预配或取消预配
遇到用户预配问题时,建议检查用户是否缺少 SCIM 元数据。
如果为组织实现了 SCIM 配置,则应从标识提供者触发对用户组织成员身份的任何更改。 如果用户手动而不是通过现有的 SCIM 集成被邀请到组织,他们的用户帐户可能无法正确链接到其 SCIM 标识。 这可以防止将来通过 SCIM 取消配置用户帐户。 如果手动删除用户而不是通过现有 SCIM 集成删除,则将保留陈旧的链接身份,如果用户需要重新加入组织,这可能会导致问题。
如果组织成员缺少 SCIM 元数据,则可以通过 IdP 手动为用户重新配置 SCIM。
审核用户是否缺少 SCIM 元数据
如果您怀疑或注意到任何用户未按预期进行预配或取消预配,我们建议您审核组织中的所有用户。
要检查用户的外部标识中是否具有 SCIM 标识(SCIM 元数据),可以在 GitHub 上一次检查一个组织成员的 SCIM 元数据,也可以使用 GitHub API 以编程方式检查所有组织成员。
当 IdP 将预配调用发送到 GitHub SCIM API 时,该 API 调用中的 SCIM userName
需要与组织中用户链接的 SAML 标识中存储的 SAML nameID
相匹配。 如果这两个值不匹配,则不会填充 SCIM 元数据,并且不会成功链接 SCIM 标识。 要检查这些值是否匹配,请使用 GitHub API。
审核 GitHub 上的组织成员
作为组织所有者,若要确认单个组织成员是否存在 SCIM 元数据,请访问此 URL,替换 <organization>
和 <username>
:
https://github.com/orgs/<organization>/people/<username>/sso
如果用户的外部标识包括 SCIM 元数据,则组织所有者应在该页面上看到 SCIM 标识部分。 如果其外部标识不包含任何 SCIM 元数据,则 SCIM 标识部分将不存在。
通过 GitHub API 审核组织成员
作为组织所有者,您还可以查询 SCIM REST API 或 GraphQL 以列出组织中的所有 SCIM 预配置标识。
使用 REST API
SCIM REST API 仅返回在其外部标识下填充了 SCIM 元数据的用户的数据。 我们建议您将 SCIM 预配置身份列表与组织所有成员的列表进行比较。
有关详细信息,请参阅:
使用 GraphQL
此 GraphQL 查询显示组织中每个用户的 SAML NameId
、SCIM UserName
和 GitHub 用户名 (login
)。 若要使用此查询,请将 ORG
替换为你的组织名称。
{
organization(login: "ORG") {
samlIdentityProvider {
ssoUrl
externalIdentities(first: 100) {
edges {
node {
samlIdentity {
nameId
}
scimIdentity {
username
}
user {
login
}
}
}
}
}
}
}
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -d '{ "query": "{ organization(login: \"ORG\") { samlIdentityProvider { externalIdentities(first: 100) { pageInfo { endCursor startCursor hasNextPage } edges { cursor node { samlIdentity { nameId } scimIdentity {username} user { login } } } } } } }" }' https://api.github.com/graphql
有关使用 GraphQL API 的更多信息,请参阅:
通过身份提供商为用户重新预配 SCIM
您可以通过 IdP 手动为用户重新预配 SCIM。 例如,要解决 Okta 的预配错误,可以在 Okta 管理门户中取消分配用户并将其重新分配给 GitHub 应用。 这应该会触发 Okta 进行 API 调用,以便在 GitHub 上为这些用户填充 SCIM 元数据。 有关详细信息,请参阅 Okta 文档中的从应用程序取消分配用户或将用户分配给应用程序。
要确认是否已创建用户的 SCIM 标识,我们建议您使用已确认没有 SCIM 外部标识的单个组织成员来测试此过程。 手动更新 IdP 中的用户后,您可以检查用户的 SCIM 身份是使用 SCIM API 创建的,还是在 GitHub 上创建的。 有关详细信息,请参阅审核用户是否缺少 SCIM 元数据或“SCIM 的 REST API 端点”。
如果为用户重新预配 SCIM 不起作用,请联系 GitHub 支持。
SAML 标识冲突错误
当用户首次尝试向 SAML 标识提供者 (IdP) 进行身份验证以访问 GitHub 组织或企业时,可能会收到以下错误消息。
GitHub 用户帐户 [GitHub 用户名] 当前已取消链接。 但你正在尝试使用 [IdP 用户帐户] SAML 标识(已链接到 [组织/企业] 中的其他 GitHub 用户帐户)向标识提供者进行身份验证。 请联系 GitHub [组织/企业] 所有者之一获取帮助。
如果 IdP 为 Entra ID,错误消息将包含 Entra ID 中的链接标识的 User Object ID
,GitHub 将其引用为 External ID
。
显示此错误消息的原因是外部标识只能链接到组织或企业中的单个 GitHub 用户帐户。
标识具有冲突标识的用户
当用户报告遇到此错误,你可以通过以下步骤来标识存在冲突的帐户。
- 使用 GitHub GraphQL API 确定链接到冲突的外部标识的是哪个用户。
- 如果 SAML 是在 GitHub 组织级别配置的:须由组织所有者在组织级别查询现有外部标识,并按用户在进行身份验证时所用的导致此错误的 IdP 帐户的 SAML
NameID
来筛选这些标识。 请参阅platform-samples
存储库中的 org-saml-identities-filtered-by-nameid-username.graphql 示例。 - 如果 SAML 是在 GitHub 企业级别配置的:须有企业所有者在企业级别查询现有外部标识,并按用户在进行身份验证时所用的导致此错误的 IdP 帐户的 SAML
NameID
来筛选这些标识。 请参阅platform-samples
存储库中的 enterprise-saml-identities-filtered-by-nameid.graphql 示例。
- 如果 SAML 是在 GitHub 组织级别配置的:须由组织所有者在组织级别查询现有外部标识,并按用户在进行身份验证时所用的导致此错误的 IdP 帐户的 SAML
- 如果标识了与冲突的外部标识关联的 GitHub 用户,若要确认该用户是否仍是该企业中及其内的任何组织中的有效用户,可由企业所有者按照 查看企业中的人员 中的步骤操作。
解决冲突
如果已按相关步骤标识冲突帐户,根据所获得的发现,有不同的解决方法可选择。 如果在尝试执行这些步骤时遇到问题或有疑问,可以使用 GitHub 支持门户 开立 GitHub 支持票证。
冲突的 GitHub 用户不再需要访问权限
如果存在与冲突的外部标识关联的但不再需要 GitHub 组织或企业访问权限**** 的 GitHub 用户帐户,请删除其成员身份。 如果正确删除了用户,应会同时删除其链接的 SAML 标识以及组织级别的 SCIM 标识(如果存在)。
- 如果使用 SCIM 预配来管理组织成员身份,则需要通过 SCIM 从 IdP 取消相关用户的预配,而不执行 GitHub 上的步骤。 否则,用户链接的 SAML 和 SCIM 标识将仍保留在组织中,这可能会继续导致相同的错误。
- 如果未使用 SCIM 预配来管理组织成员身份,请参阅 从组织中删除成员 或 删除企业成员。 请确保同时从 IdP 中的组织或企业的 GitHub 应用中删除相关用户的访问权限。
若要确认已从 GitHub 组织中成功删除某用户的 SAML 或 SCIM 标识,请参阅 排除组织的标识和访问管理故障。
冲突的 GitHub 用户仍需要访问权限
如果存在与冲突的外部标识关联的 GitHub 用户账户,且该用户仍需要访问**** 组织或企业,你需要更改该用户账户链接的标识****,或让收到错误的用户使用不同的 IdP 标识进行身份验证****。
- 如果使用 SCIM 预配来管理组织的成员身份,且需要更改链接到成员 GitHub 帐户的外部标识,请从 IdP 取消预配然后重新预配相关用户(例如从应用取消分配相关用户再将其重新分配给应用)。
- 取消预配 IdP 用户后,将从 GitHub 组织中删除其 GitHub 帐户和链接的 SAML/SCIM 标识。
- 将 IdP 用户重新预配到 GitHub 组织时,将创建新的待处理的组织邀请和新的未链接的 SCIM 标识。 这使该用户可使用此 GitHub 用户帐户登录、通过 SAML 进行身份验证,并将新的 IdP 标识链接到其帐户。 这些步骤将有助于确保新的 SAML 和 SCIM 标识均正确链接到组织中的 GitHub 用户帐户。
- 如果未使用 SCIM 预配来管理组织成员身份,或是在企业级别配置的 SAML,可以按以下文章之一中的步骤撤销为用户链接的外部标识:
未找到冲突的 GitHub 用户
如果没有与冲突的外部标识关联的 GitHub 用户帐户,可以撤销该外部标识。
- 如果使用 SCIM 预配来管理组织的成员身份,请从 IdP 中删除过时的未链接的标识(例如从 IdP 应用中取消分配相关用户)。
- 如果 IdP 不向 GitHub 发送相应的 SCIM API 调用,则标识将仍保留在组织中,这可能会继续导致相同错误。
- 若要确认已从 GitHub 组织中成功删除某用户的 SAML 或 SCIM 标识,请参阅 排除组织的标识和访问管理故障。
- 如果未使用 SCIM 预配来管理组织的成员身份,要撤销链接的外部标识,可导航到以下 URL 之一撤销外部标识。 将
USERNAME
替换为无法登录的用户的 GitHub 用户名,或将ORGANIZATION
或ENTERPRISE
替换为相应的值。https://github.com/orgs/ORGANIZATION/people/USERNAME/sso
https://github.com/enterprises/ENTERPRISE/people/USERNAME/sso