排查 Windows 设备上的主刷新令牌问题

本文介绍在已加入 Microsoft Entra 的 Windows 设备上使用 Microsoft Entra 凭据进行身份验证时,如何排查与主刷新令牌 (PRT) 相关的问题。

在加入 Microsoft Entra ID 或混合 Microsoft Entra ID 的设备上,身份验证的主要组件是 PRT。 首次在加入 Microsoft Entra 的设备上使用 Microsoft Entra 凭据登录到 Windows 10 时,可获取此令牌。 此 PRT 缓存在该设备上。 对于后续登录,缓存的令牌用于允许你使用桌面。

作为锁定和解锁设备或再次登录 Windows 过程的一部分,系统每四个小时尝试一次后台网络身份验证,以刷新该 PRT。 如果出现阻止刷新令牌的问题,则 PRT 最终会过期。 过期会影响对 Microsoft Entra 资源的单一登录 (SSO)。 它还会导致显示登录提示。

如果你怀疑存在 PRT 问题,则建议先收集 Microsoft Entra 日志,然后按照故障排除清单中概述的步骤进行操作。 首先针对任何 Microsoft Entra 客户端问题执行此操作,最好是在重现会话中执行该操作。 请在提交支持请求之前完成此过程。

故障排除清单

步骤 1:获取主刷新令牌的状态

  1. 使用遇到 PRT 问题的用户帐户登录到 Windows。

  2. 选择“开始”,然后搜索并选择“命令提示符”。

  3. 若要运行设备注册命令 (dsregcmd),请输入 dsregcmd /status

  4. 找到设备注册命令输出的“SSO 状态”部分。 以下文本显示了此部分的示例:

    +----------------------------------------------------------------------+
    | SSO State                                                            |
    +----------------------------------------------------------------------+
    
                    AzureAdPrt : YES
          AzureAdPrtUpdateTime : 2020-07-12 22:57:53.000 UTC
          AzureAdPrtExpiryTime : 2020-07-26 22:58:35.000 UTC
           AzureAdPrtAuthority : https://login.partner.microsoftonline.cn/00001111-aaaa-2222-bbbb-3333cccc4444
                 EnterprisePrt : YES
       EnterprisePrtUpdateTime : 2020-07-12 22:57:54.000 UTC
       EnterprisePrtExpiryTime : 2020-07-26 22:57:54.000 UTC
        EnterprisePrtAuthority : https://msft.sts.microsoft.com:443/adfs
    
    +----------------------------------------------------------------------+
    
  5. 检查 AzureAdPrt 字段的值。 如果设置为 NO,则尝试从 Microsoft Entra ID 获取 PRT 状态时会出错。

  6. 检查 AzureAdPrtUpdateTime 字段的值。 如果 AzureAdPrtUpdateTime 字段的值超过四个小时,则可能存在阻止 PRT 刷新的问题。 锁定和解锁设备以强制 PRT 刷新,然后检查时间是否已更新。

步骤 2:获取错误代码

下一步是获取导致 PRT 错误的错误代码。 获取 PRT 错误代码的最快方法是检查设备注册命令输出。 但是,此方法需要 Windows 10 2021 年 5 月更新(版本 21H1)或更高版本。 另一种方法是在 Microsoft Entra 分析和操作日志中查找错误代码。

方法 1:检查设备注册命令输出

备注

仅当使用 Windows 10 2021 年 5 月更新(版本 21H1)或更高版本的 Windows 时,此方法才可用。

若要获取 PRT 错误代码,请运行 dsregcmd 命令,然后找到 SSO State 部分。 在 AzureAdPrt 字段中,Attempt Status 字段包含错误代码。 在以下示例中,错误代码为 0xc000006d

                AzureAdPrt : NO
       AzureAdPrtAuthority : https://login.partner.microsoftonline.cn/aaaa0000-bb11-2222-33cc-444444dddddd
     AcquirePrtDiagnostics : PRESENT
      Previous Prt Attempt : 2020-09-18 20:20:09.760 UTC
            Attempt Status : 0xc000006d
             User Identity : user@contoso.com
           Credential Type : Password
            Correlation ID : aaaa0000-bb11-2222-33cc-444444dddddd
              Endpoint URI : https://login.partner.microsoftonline.cn/aaaa0000-bb11-2222-33cc-444444dddddd/oauth2/token
               HTTP Method : POST
                HTTP Error : 0x0
               HTTP status : 400
         Server Error Code : invalid_grant
  Server Error Description : AADSTS50126: Error validating credentials due to invalid username or password.

方法 2:使用事件查看器检查 AAD 分析和操作日志

  1. 选择“开始”,然后搜索并选择“事件查看器”。

  2. 如果控制台树未显示在“事件查看器”窗口中,请选择“显示/隐藏控制台树”图标以使控制台树可见。

  3. 在控制台树中,选择“事件查看器(本地)”。 如果子节点未显示在此项下方,请双击所选内容以显示它们。

  4. 选择视图菜单。 如果“显示分析和调试日志”旁边未显示选中标记,请选择此菜单项以启用该功能。

  5. 在控制台树中,展开“应用程序和服务日志”>“Microsoft”>“Windows”>“AAD”。 此时将显示“操作”和“分析”子节点。

    备注

    在 Microsoft Entra 云身份验证提供程序 (CloudAP) 插件中,“错误”事件会写入“操作”事件日志,而信息事件则会写入“分析”事件日志。 必须检查操作分析事件日志,以排查 PRT 问题。

  6. 在控制台树中,选择“分析”节点以查看与 AAD 相关的分析事件。

  7. 在分析事件列表中,搜索事件 ID 1006 和 1007。 事件 ID 1006 表示 PRT 获取流的开始,事件 ID 1007 表示 PRT 获取流的结束。 在事件 ID 1006 和事件 ID 1007 之间发生的 AAD 日志(分析和操作)中的所有事件都记录为 PRT 获取流的一部分。 下表显示了事件列表示例。

    级别 日期和时间 事件 ID 任务类别
    信息 6/24/2020 3:35:35 AM AAD 1006 AadCloudAPPlugin 操作
    信息 6/24/2020 3:35:35 AM AAD 1018 AadCloudAPPlugin 操作
    信息 6/24/2020 3:35:35 AM AAD 1144 AadCloudAPPlugin 操作
    信息 6/24/2020 3:35:35 AM AAD 1022 AadCloudAPPlugin 操作
    错误 6/24/2020 3:35:35 AM AAD 1084 AadCloudAPPlugin 操作
    错误 6/24/2020 3:35:35 AM AAD 1086 AadCloudAPPlugin 操作
    错误 6/24/2020 3:35:35 AM AAD 1160 AadCloudAPPlugin 操作
    信息 6/24/2020 3:35:35 AM AAD 1007 AadCloudAPPlugin 操作
    信息 6/24/2020 3:35:35 AM AAD 1157 AadCloudAPPlugin 操作
    信息 6/24/2020 3:35:35 AM AAD 1158 AadCloudAPPlugin 操作
  8. 双击包含事件 ID 1007 的行。 此时将显示此事件的“事件属性”对话框。

  9. 在“常规”选项卡上的说明框中,复制错误代码。 错误代码是一个以 0x 开头、后跟 8 位十六进制数的 10 个字符的字符串。

步骤 3:获取某些错误代码的故障排除说明

状态代码(具有“STATUS_”前缀,以“0xc000”开头的代码)

STATUS_LOGON_FAILURE (-1073741715 / 0xc000006d)、
STATUS_WRONG_PASSWORD (-1073741718 / 0xc000006a)
原因
  • 设备无法连接到 Microsoft Entra 身份验证服务。

  • 设备收到来自以下源之一的 400 Bad Request HTTP 错误响应:

    • Microsoft Entra 身份验证服务
    • WS-Trust 协议的终结点(联合身份验证所需)
解决方案
  • 如果本地环境需要出站代理,请确保设备的计算机帐户能够发现出站代理并以无提示方式向其进行身份验证。

  • 获取服务器错误代码和错误说明,然后转到“常见服务器错误代码(“AADSTS”前缀)”部分,以查找该服务器错误代码的原因和解决方案详细信息。

    在 Microsoft Entra 操作日志中,如果 Microsoft Entra 身份验证服务中发生错误,则事件 ID 1081 将包含服务器错误代码和错误说明。 如果错误发生在 WS-Trust 终结点中,则可以在事件 ID 1088 中找到服务器错误代码和错误说明。 在 Microsoft Entra 分析日志中,事件 ID 1022 的第一个实例(位于操作事件 ID 1081 和 1088 之前)包含正在访问的 URL。

    若要查看 Microsoft Entra 操作和分析日志中的事件 ID,请参阅方法 2:使用事件查看器检查 Microsoft Entra 分析和操作日志部分。

STATUS_REQUEST_NOT_ACCEPTED (-1073741616 / 0xc00000d0)
原因

设备收到来自以下源之一的 400 Bad Request HTTP 错误响应:

  • Microsoft Entra 身份验证服务
  • WS-Trust 协议的终结点(联合身份验证所需)
解决方案

获取服务器错误代码和错误说明,然后转到“常见服务器错误代码(具有“AADSTS”前缀)”部分,以查找该服务器错误代码的原因和解决方案详细信息。

在 Microsoft Entra 操作日志中,如果 Microsoft Entra 身份验证服务中发生错误,则事件 ID 1081 将包含服务器错误代码和错误说明。 如果错误发生在 WS-Trust 终结点中,则可以在事件 ID 1088 中找到服务器错误代码和错误说明。 在 Microsoft Entra 分析日志中,事件 ID 1022 的第一个实例(位于操作事件 ID 1081 和 1088 之前)包含正在访问的 URL。

若要查看 Microsoft Entra 操作和分析日志中的事件 ID,请参阅方法 2:使用事件查看器检查 Microsoft Entra 分析和操作日志部分。

STATUS_NETWORK_UNREACHABLE (-1073741252 / 0xc000023c)、
STATUS_BAD_NETWORK_PATH (-1073741634 / 0xc00000be)、
STATUS_UNEXPECTED_NETWORK_ERROR (-1073741628 / 0xc00000c4)
原因
  • 设备收到来自以下源之一的 4xx HTTP 错误响应:

    • Microsoft Entra 身份验证服务
    • WS-Trust 协议的终结点(联合身份验证所需)
  • 所需终结点存在网络连接问题。

解决方案
  • 获取服务器错误代码和错误说明,然后转到“常见服务器错误代码(具有“AADSTS”前缀)”部分,以查找该服务器错误代码的原因和解决方案详细信息。

    在 Microsoft Entra 操作日志中,如果 Microsoft Entra 身份验证服务中发生错误,则事件 ID 1081 将包含服务器错误代码和错误说明。 如果错误发生在 WS-Trust 终结点中,则可以在事件 ID 1088 中找到服务器错误代码和错误说明。

  • 对于网络连接问题,请从网络堆栈获取正在访问的 URL 和子错误代码。 Microsoft Entra 分析日志中的事件 ID 1022 包含正在访问的 URL。 Microsoft Entra 操作日志中的事件 ID 1084 包含网络堆栈中的子错误代码。

若要查看 Microsoft Entra 操作和分析日志中的事件 ID,请参阅方法 2:使用事件查看器检查 Microsoft Entra 分析和操作日志部分。

STATUS_NO_SUCH_LOGON_SESSION (-1073741729 / 0xc000005f)
原因

由于 Microsoft Entra 身份验证服务找不到用户的域,用户领域发现失败。

解决方案

常见 CloudAP 插件错误代码(具有“AAD_CLOUDAP_E_”前缀,以“0xc004”开头的代码)

AAD_CLOUDAP_E_OAUTH_USERNAME_IS_MALFORMED (-1073445812 / 0xc004844c)
原因

用户的 UPN 未采用预期格式。 UPN 值因设备类型而异,如下表所示。

设备加入类型 UPN 值
Microsoft Entra 联接设备 用户登录时输入的文本
Microsoft Entra 混合联接设备 域控制器在登录过程中返回的 UPN
解决方案
  • 根据 Internet 标准 RFC 822,将用户的 UPN 设置为 Internet 样式的登录名称。 若要查找当前 UPN,请在 Microsoft Entra 分析日志中查找事件 ID 1144。

    若要查看 Microsoft Entra 分析日志中的事件 ID,请参阅方法 2:使用事件查看器检查 Microsoft Entra 分析和操作日志部分。

  • 对于已加入混合 Microsoft Entra 的设备,请确保将域控制器配置为以正确的格式返回 UPN。 若要在域控制器中显示配置的 UPN,请运行以下 whoami 命令:

    whoami /upn
    

    如果 Active Directory 配置了正确的 UPN,请收集本地安全机构子系统服务(LSASS 或 lsass.exe)的时间旅行跟踪

  • 如果无法路由本地域名(例如,如果 UPN 为 jdoe@contoso.local),请配置备用登录 ID (AltID)。 (若要查看先决条件,请参阅规划 Microsoft Entra 混合加入实现。)

AAD_CLOUDAP_E_OAUTH_USER_SID_IS_EMPTY (-1073445822 / 0xc0048442)
原因

Microsoft Entra 身份验证服务返回的 ID 令牌中缺少用户安全标识符 (SID)。

解决方案

请确保网络代理不会干扰或修改服务器响应。

AAD_CLOUDAP_E_WSTRUST_SAML_TOKENS_ARE_EMPTY (-1073445695 / 0xc00484c1 / 0x800484c1)
原因

你从 WS-Trust 协议终结点(联合身份验证所需)收到错误。

解决方案
AAD_CLOUDAP_E_HTTP_PASSWORD_URI_IS_EMPTY (-1073445749 / 0xc004848b)
原因

Metadata Exchange (MEX) 终结点配置不正确。 MEX 响应不包含任何密码 URL。

解决方案
  • 请确保网络代理不会干扰或修改服务器响应。

  • 修复 MEX 配置,以在响应中返回有效的 URL。

AAD_CLOUDAP_E_HTTP_CERTIFICATE_URI_IS_EMPTY (-1073445748 / 0xc004848c)
原因

Metadata Exchange (MEX) 终结点配置不正确。 MEX 响应不包含任何证书终结点 URL。

解决方案
  • 请确保网络代理不会干扰或修改服务器响应。

  • 修复标识提供者中的 MEX 配置,以便在响应中返回有效的证书 URL。

常见的 XML 错误代码(以“0xc00c”开头的代码)

WC_E_DTDPROHIBITED (-1072894385 / 0xc00cee4f)
原因

来自 WS-Trust 协议终结点(联合身份验证所需)的 XML 响应包含文档类型定义 (DTD)。 XML 响应中不应包含 DTD,如果包含 DTD,则响应分析会失败。

解决方案

常见服务器错误代码(具有“AADSTS”前缀)

可以在 Microsoft Entra 身份验证和授权错误代码中找到服务器错误代码的完整列表和说明。

AADSTS50155:设备身份验证失败
原因
解决方案

根据设备加入类型重新注册设备。 有关说明,请参阅“我禁用或删除了我的设备。但该设备上的本地状态显示它仍处于已注册状态。我该怎么办?”。

AADSTS50034:<tenant-id> 目录中不存在用户帐户 <Account>
原因

Microsoft Entra ID 在租户中找不到该用户帐户。

解决方案
AADSTS50126:由于用户名或密码无效,验证凭据时出错
原因
  • 用户在登录 UI 中输入了错误的用户名或密码。

  • 由于以下情况,密码尚未同步到 Microsoft Entra ID:

    • 租户已启用密码哈希同步
    • 设备是 Microsoft Entra 混合加入设备。
    • 用户最近更改了密码。
解决方案

若要获取具有新凭据的全新 PRT,请等待 Microsoft Entra 同步完成。

常见网络错误代码(具有“ERROR_WINHTTP_”前缀)

可以在错误消息 (Winhttp.h) 中找到网络错误代码的完整列表和说明。

ERROR_WINHTTP_TIMEOUT (12002)、
ERROR_WINHTTP_NAME_NOT_RESOLVED (12007)、
ERROR_WINHTTP_CANNOT_CONNECT (12029)、
ERROR_WINHTTP_CONNECTION_ERROR (12030)
原因

常见的一般网络相关问题。

解决方案
  • 获取正在访问的 URL。 可以在 Microsoft Entra 操作日志的事件 ID 1084 或 Microsoft Entra 分析日志的事件 ID 1022 中找到 URL。

    若要查看 Microsoft Entra 操作和分析日志中的事件 ID,请参阅方法 2:使用事件查看器检查 Microsoft Entra 分析和操作日志部分。

  • 如果本地环境需要出站代理,请确保设备的计算机帐户能够发现出站代理并以无提示方式向其进行身份验证。

  • 按照以下步骤收集网络跟踪:

    重要

    在此过程中,请勿使用 Fiddler。

    1. 运行以下 netsh trace start 命令:

      netsh trace start scenario=InternetClient_dbg capture=yes persistent=yes
      
    2. 锁定设备。

    3. 如果该设备是 Microsoft Entra 混合加入设备,请等待至少 60 秒,让 PRT 获取任务完成。

    4. 解锁设备。

    5. 运行以下 netsh trace stop 命令:

      netsh trace stop
      

步骤 4:收集日志和跟踪

常规日志

  1. 下载身份验证脚本存档,并将脚本提取到本地目录中。 如有必要,请查看 KB 4487175 中的使用说明。

  2. 打开管理 PowerShell 会话,将当前目录更改为保存身份验证脚本的目录。

  3. 若要开始错误跟踪会话,请输入以下命令:

    .\Start-auth.ps1 -v -acceptEULA
    
  4. 切换 Windows 用户帐户以转到问题用户的会话。

  5. 锁定设备。

  6. 如果该设备是 Microsoft Entra 混合加入设备,请等待至少 60 秒,让 PRT 获取任务完成。

  7. 解锁设备。

  8. 将 Windows 用户帐户切换回运行跟踪会话的管理会话。

  9. 重现问题后,请运行以下命令以结束跟踪会话:

    .\stop-auth.ps1
    
  10. 等待所有跟踪完全停止。

时间旅行跟踪

以下过程介绍如何使用时间旅行调试 (TTD) 功能捕获跟踪。

警告

时间旅行跟踪包含个人数据。 此外,本地安全机构子系统服务(LSASS 或 lsass.exe)跟踪包含极其敏感的信息。 处理这些跟踪时,请确保使用存储和共享此类信息的最佳做法。

  1. 选择“开始”,输入 cmd,在搜索结果中找到并右键单击“命令提示符”,然后选择“以管理员身份运行”。

  2. 在命令提示符下,创建一个临时目录:

    mkdir c:\temp
    
  3. 运行以下 tasklist 命令:

    tasklist /m lsasrv.dll
    
  4. tasklist 命令输出中,找到 lsass.exe 的进程标识符 (PID)。

  5. 若要开始 lsass.exe 进程的跟踪会话,请运行以下时间旅行调试命令 (TTD.exe):

    TTD.exe -attach <lsass-pid> -out c:\temp
    
  6. 锁定在域帐户下登录的设备。

  7. 解锁设备。

  8. 若要结束时间旅行跟踪会话,请运行以下 TTD 命令:

    TTD.exe -stop all
    
  9. 获取最新的 lsass##.run 文件。