使用 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
我正在尝试创建一个批处理来更改用户的 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