使用 Graph API 和 Powershell 联合 ID 的密码授予类型

Using Graph API with password grant type for a federated ID with Powershell

我正在尝试创建一个批处理来更改用户的 MFA phone 编号,以防它搞砸并且设置了无法访问的 phone 编号。

API不支持应用权限,所以想用password grant类型,实现Administrator的ID和密码加密。我知道这远非最佳,但我看不到任何其他方式。

这是我使用的代码。

$ReqTokenBody = @{
  Grant_Type    = "Password"
  Client_Id     = $clientID
  Client_Secret = $clientSecret
  Username      = $privilegedAuthenticationManager
  Password      = $password
  Scope         = "https://graph.microsoft.com/.default"
}

$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

我面临的问题是,这仅受托管 ID 支持(不从 AD 同步),我真的很想使用联合 ID,因为这是公司政策。

有没有办法在 powershell 中做到这一点?如果不是,也许在 C# 中?

非常感谢任何帮助。谢谢。

如果您使用 MSAL 或 ADAL 库,它将为您处理联合身份验证(例如,WSTrust SOAP post 针对您的 ADFS 服务器的活动端点)。 Powershell 库中有适用于 MSAL 和 ADAL 的模块,例如 https://www.powershellgallery.com/packages/MSAL.PS/4.2.1.3

直接使用它的代码对于 ADAL 来说非常简单

Import-Module .\Microsoft.IdentityModel.Clients.ActiveDirectory.dll -Force
$ClientId = "5471030d-f311-4c5d-91ef-74ca885463a7"

$Credentials = get-credential
$domain = $Credentials.UserName.ToString().Split('@')[1]

$TenantId = (Invoke-WebRequest https://login.windows.net/$domain/v2.0/.well-known/openid-configuration | ConvertFrom-Json).token_endpoint.Split('/')[3]

$ClientCredentials = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential" -ArgumentList $Credentials.UserName.ToString(),$Credentials.GetNetworkCredential().password.ToString()
$Context = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.microsoftonline.com/$TenantId")
return ([Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions]::AcquireTokenAsync($Context,"https://graph.microsoft.com", $ClientId ,$ClientCredentials)).Result