gpt4 book ai didi

c# - 我正在尝试在 C# 应用程序上运行一些 powershell 脚本以授予对 Azure AD 应用程序的权限,它适用于 Powershell,但不适用于 C# 应用程序

转载 作者:行者123 更新时间:2023-12-03 02:54:18 24 4
gpt4 key购买 nike

我正在尝试在 C# 应用程序中使用 Powershell 命令授予对 Azure Active Directory 应用程序的权限。首先我尝试在 powershell 中使用下面的脚本。

Function Grant-OAuth2PermissionsToApp{
Param(
[Parameter(Mandatory=$true)]$Username, #global administrator username
[Parameter(Mandatory=$true)]$Password, #global administrator password
[Parameter(Mandatory=$true)]$azureAppId #application ID of the azure application you wish to admin-consent to
)

$secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($Username, $secpasswd)
$res = login-azurermaccount -Credential $mycreds
$context = Get-AzureRmContext
$tenantId = $context.Tenant.Id
$refreshToken = @($context.TokenCache.ReadItems() | where {$_.tenantId -eq $tenantId -and $_.ExpiresOn -gt (Get-Date)})[0].RefreshToken
$body = "grant_type=refresh_token&refresh_token=$($refreshToken)&resource=74658136-14ec-4630-ad9b-26e160ff0fc6"
$apiToken = Invoke-RestMethod "https://login.windows.net/$tenantId/oauth2/token" -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'
$header = @{
'Authorization' = 'Bearer ' + $apiToken.access_token
'X-Requested-With'= 'XMLHttpRequest'
'x-ms-client-request-id'= [guid]::NewGuid()
'x-ms-correlation-id' = [guid]::NewGuid()}
$url = "https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$azureAppId/Consent?onBehalfOfAll=true"
Invoke-RestMethod -Uri $url -Headers $header -Method POST -ErrorAction Stop
}

此代码授予 Azure AD 注册应用程序的权限。我修改了此脚本以在 C# 应用程序中运行它。

Runspace runspace2 = RunspaceFactory.CreateRunspace();
runspace2.Open();
Pipeline pl = runspace2.CreatePipeline();
pl.Commands.AddScript("Function Grant-OAuth2PermissionsToApp{ \n" +
"$azureAppId = '" + appID + "'; \n" +
"$username = '<login id >'; \n" +
"$password = convertTo-securestring '<password>' -AsPlainText -Force; \n" +
"$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password; \n" +
"$res = login-azurermaccount -Credential $cred; \n" +
"$context = Get-AzureRmContext; \n" +
"$tenantId = $context.Tenant.Id; \n" +
"$refreshToken = @($context.TokenCache.ReadItems() | where {$_.tenantId -eq $tenantId -and $_.ExpiresOn -gt (Get-Date)})[0].RefreshToken; \n" +
"$body = 'grant_type=refresh_token&refresh_token=$($refreshToken)&resource=\"74658136-14ec-4630-ad9b-26e160ff0fc6\"'; \n" +
"$apiToken = Invoke-RestMethod 'https://login.windows.net/$tenantId/oauth2/authorize?client_id=$azureAppId&response_type=code&&redirect_uri=https%3A%2F%2FPowerBiApp.contoso.com&response_mode=query' -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'; \n" +
"$header = @{ \n" +
"'Authorization'='Bearer '+$apiToken.access_token; \n" +
"'X-Requested-With'='XMLHttpRequest'; \n" +
"'x-ms-client-request-id'=[guid]::NewGuid(); \n" +
"'x-ms-correlation-id'=[guid]::NewGuid(); \n" +
"}; \n" +
"$url = 'https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$azureAppId/Consent?onBehalfOfAll=true'; \n" +
"Invoke-RestMethod -Uri $url -Headers $header -Method POST -ErrorAction Stop; \n" +
"}");
pl.Commands.AddScript("Grant-OAuth2PermissionsToApp");
var r = pl.Invoke();

这给了我解析错误 - 刷新 token 格式错误或无效。我尝试了以下方法来获得解决方案:

  1. 在我得到 $refreshToken 的值后的代码中我尝试分割字符串,这样如果我获得 token 字符串两次,我只能选择一个。

    $refreshtoken = $refreshtoken.Split(''n')[0];

  2. 在某个地方我发现我们在 powershell 脚本中使用“-”,例如 -AsPlainText可能会更改为endash。我重新检查脚本中使用的所有“-”。

  3. 我发现的另一个解决方案是,当我们尝试使用原始数据获取刷新 token 时,我们应该使用下面的 url 和参数。我从这个 site 得到这个网址

    https://login.microsoftonline.com/{tenant}/oauth2/authorize?client_id=<ApplicationId>&response_type=code&&redirect_uri=<Application redirect Url>&response_mode=query

我尝试过的所有方法都不起作用。有什么正确的方法可以解决这个问题吗?或者有没有其他方法可以获取可用于授予权限的RefreshToken?

最佳答案

我认为根本原因是由于某些powershell脚本被错误地转换为c#代码。

我在c#代码中设置了断点,并获取生成的powershell脚本,然后与原始powershell脚本进行比较。 c#中有些脚本是用单引号括起来的,但在原来的powershell中,是用双引号括起来的,这可能会导致一些错误。

例如,在原始powershell中,这行代码:$body = "grant_type=refresh_token&refresh_token=$($refreshToken)&resource=74658136-14ec-4630-ad9b-26e160ff0fc6",但是在你的c#代码(设置断点来获取值),它用单引号括起来,例如 $body ='grant_type=refresh_token&refresh_token=$($refreshToken)&resource="74658136-14ec-4630-ad9b-26e160ff0fc6"'.

因此,请在您的 c# 代码处设置断点,并从 c# 获取生成的 powershell 脚本,并确保它与您原始的 powershell 脚本相同。

根据比较,您的 C# 代码中有 3 行需要更改,您可以将相应的行替换为以下行:

"$body = \"grant_type=refresh_token&refresh_token=$($refreshToken)&resource=74658136-14ec-4630-ad9b-26e160ff0fc6\"; \n" +

"$apiToken = Invoke-RestMethod \"https://login.windows.net/$tenantId/oauth2/authorize?client_id=$azureAppId&response_type=code&&redirect_uri=https%3A%2F%2FPowerBiApp.contoso.com&response_mode=query\" -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'; \n" +

"$url = \"https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$azureAppId/Consent?onBehalfOfAll=true\"; \n" +

希望有帮助。

从 C# 代码中获取生成的 ps 脚本:

enter image description here

关于c# - 我正在尝试在 C# 应用程序上运行一些 powershell 脚本以授予对 Azure AD 应用程序的权限,它适用于 Powershell,但不适用于 C# 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54035491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com