如何使用Microsoft Graph PowerShell移除Azure MFA客户端过期证书
解决Azure Multi-Factor Auth Client过期证书移除的403权限问题
针对微软官方应用(如Azure Multi-Factor Auth Client)的过期证书清理,使用Remove-MgServicePrincipalKey时出现403权限错误,核心原因是这类官方托管的服务主体需要提供**持有证明(Proof-of-Possession)**来验证操作合法性。以下是具体解决步骤:
步骤1:确认所需权限
确保你的账号拥有以下权限之一(需管理员同意):
- Application.ReadWrite.All(委派或应用权限)
- Application Administrator角色权限
步骤2:获取服务主体及有效密钥
先定位目标服务主体,并筛选出当前未过期的有效证书密钥:
# 获取Azure MFA Client服务主体 $sp = Get-MgServicePrincipal -Filter "appid eq '981f26a1-7f43-403b-a875-f8b09b8cd720'" # 筛选出未过期的有效密钥 $validKeys = $sp.KeyCredentials | Where-Object { $_.EndDateTime -gt (Get-Date) }
步骤3:生成持有证明(Proof Token)
需要用上述有效密钥对应的证书生成JWT格式的持有证明,验证你拥有该应用的合法凭据:
# 示例:从本地证书存储获取有效证书(根据实际情况调整路径或筛选条件) $cert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq $validKeys[0].KeyId } # 生成JWT作为持有证明 $tokenHandler = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler $claims = @( New-Object System.Security.Claims.Claim("sub", $sp.Id), New-Object System.Security.Claims.Claim("iss", $sp.AppId), New-Object System.Security.Claims.Claim("jti", [Guid]::NewGuid().ToString()) ) $tokenDescriptor = New-Object System.IdentityModel.Tokens.SecurityTokenDescriptor $tokenDescriptor.Subject = New-Object System.Security.Claims.ClaimsIdentity($claims) $tokenDescriptor.SigningCredentials = New-Object System.IdentityModel.Tokens.X509SigningCredentials($cert) $tokenDescriptor.Expires = (Get-Date).AddMinutes(5) $jwtToken = $tokenHandler.CreateToken($tokenDescriptor) $proofToken = $tokenHandler.WriteToken($jwtToken)
步骤4:传入持有证明执行删除操作
调用Remove-MgServicePrincipalKey时指定-Proof参数传入生成的证明令牌:
# 替换为你要删除的过期证书KeyID Remove-MgServicePrincipalKey -ServicePrincipalId $sp.Id -KeyId "<过期证书的KeyID>" -Proof $proofToken
关键注意事项
- 必须使用未过期的有效证书生成证明,过期证书无法通过验证
- 确保使用的Microsoft Graph PowerShell模块是最新版本,避免兼容性问题
- 执行操作的账号需具备修改官方应用的管理员权限,普通权限无法完成此操作
内容的提问来源于stack exchange,提问作者FishAce
相关产品推荐
相关产品推荐

