如何使用用户名和密码(无需应用程序ID)进行身份验证访问Azure REST API

4
我需要通过REST API获取Azure资源(https://management.azure.com 终结点)的访问令牌。我阅读过的每一篇文章都需要使用应用程序ID。在我的情况下,Azure租户刚刚被创建(通过编程方式),并且我必须在其中创建一些资源。
我所拥有的只有租户ID、订阅ID、管理员帐户的用户名和密码。如何只使用我拥有的信息进行身份验证? PowerShell是如何工作的,它不需要使用应用程序ID?

2
据我所知,您总是需要一个应用程序。Azure PowerShell 也是一个应用程序。 - juunas
想知道您是否尝试过使用Bearer令牌,az account get-access-token -s <subscription-id>或使用用户名和密码获取Bearer令牌来调用API,例如此处。Azure API页面上的“尝试我”使用Bearer令牌。 - N Singh
2个回答

5

据我所知,这是不可能的。正如junnas所说,即使您使用用户名/密码身份验证,也需要客户端ID。

在Azure上创建服务主体很容易,您可以查看此link

创建sp后,您将获得客户端ID、客户端密钥。您还需要在订阅中给sp赋予Owner角色,您可以查看此link

现在,您可以使用sp调用Power Shell中的rest api。

##get token
$TENANTID=""
$APPID=""
$PASSWORD=""
$result=Invoke-RestMethod -Uri https://login.microsoftonline.com/$TENANTID/oauth2/token?api-version=1.0 -Method Post -Body @{"grant_type" = "client_credentials"; "resource" = "https://management.core.windows.net/"; "client_id" = "$APPID"; "client_secret" = "$PASSWORD" }
$token=$result.access_token

##set subscriptionId and resource group name
$subscriptionId=""
$resourcegroupname="shui5"

$Headers=@{
    'authorization'="Bearer $token"
    'host'="management.azure.com"
    'contentype'='application/json'
}
$body='{
    "location": "northeurope",
     "tags": {
        "tagname1": "test-tag"
    }
 }'
Invoke-RestMethod  -Uri "https://management.azure.com/subscriptions/$subscriptionId/resourcegroups/${resourcegroupname}?api-version=2015-01-01"  -Headers $Headers -Method PUT -Body $body 

我知道如何注册应用程序并使用该应用程序进行身份验证。我需要自动化整个过程 - 创建租户(已完成)并使用资源管理器添加资源,而无需任何用户交互(正在尝试解决)。 - Lukas Nespor
@LukášNešpor 然后您可以使用Power Shell创建服务主体。请查看此官方文档。然后,您可以获取“租户ID”、“客户端ID”、“客户端密钥”、“订阅ID”。然后,您可以使用它们调用API。 - Shui shengbao
此外,您需要在订阅级别上授予 Owner 角色,请查看此链接 - Shui shengbao
但是,如果您的帐户是 Microsoft 帐户,则需要首先创建 Azure AD 帐户,因为 Microsoft 帐户不支持非交互式登录。此外,只有帐户和密码才能用于调用 Azure REST API,需要提供“客户端 ID”和“客户端密钥”。 - Shui shengbao
我已经使用Owner角色的服务主体。不幸的是,它并没有像预期的那样工作。即使PowerShell cmdlet说应用程序已被创建(给了我app id),但它并不存在,使用时会出现错误“AADSTS70001:在目录{GUID}中找不到标识符为'{GUID}'的应用程序”。有时其他尝试可能会有所帮助,但这是不能接受的行为。 - Lukas Nespor
显示剩余6条评论

2

您可以使用Microsoft PowerShell应用程序ID进行身份验证,而无需拥有自己的应用程序ID。以下代码片段将为您提供令牌:

原始回答:Original Answer

Import-Module MSOnline      # IMPORTANT! Loads type assembly Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext
$TENANTID = ""  # Your Tenant ID
$clientId = "1b730954-1685-4b74-9bfd-dac224a7b894"      # PowerShell Client Id
$MSMgmtURI = "https://management.core.windows.net"
$authority = "https://login.microsoftonline.com/$TENANTID"
$redirectUri = "urn:ietf:wg:oauth:2.0:oob"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
$authResult = $authContext.AcquireToken($MSMgmtURI, $clientId, $redirectUri, "Always")  
$token = $authResult.AccessToken
$headers = @{'Authorization' = "Bearer $token", 'host'="management.azure.com", 'Content-Type' = "application/json"}

这对于使用登录对话框获取访问令牌非常有用。我怀疑 PowerShell 的客户端 ID 可以在上面的 Oath2 调用中使用。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接