如何使用REST API登录Azure门户

如何使用REST API登录Azure门户,azure,azure-active-directory,azure-resource-manager,Azure,Azure Active Directory,Azure Resource Manager,我计划实现一个C#应用程序,它将使用REST API(对Azure资源管理器的API调用)创建Azure资源。调用REST API时,必须通过传递身份验证头“Authorization:Bearer yJ0eXAiOiJKV…”进行身份验证 我怎样才能得到这个不记名代币?我在网上看到的只是一个Web应用,你可以使用它的应用程序id。但是我没有任何应用程序,我也不想创建一个 我可以复制我用Fiddler截获的调用,但我认为这不是“推荐”的方式 有没有人遇到过这个问题并找到了解决方案?如果您只是想获

我计划实现一个C#应用程序,它将使用REST API(对Azure资源管理器的API调用)创建Azure资源。调用REST API时,必须通过传递身份验证头“Authorization:Bearer yJ0eXAiOiJKV…”进行身份验证

我怎样才能得到这个不记名代币?我在网上看到的只是一个Web应用,你可以使用它的应用程序id。但是我没有任何应用程序,我也不想创建一个

我可以复制我用Fiddler截获的调用,但我认为这不是“推荐”的方式


有没有人遇到过这个问题并找到了解决方案?

如果您只是想获得承载令牌。我建议您可以在文档中登录您的帐户。在我们登录之后,我们就可以获得承载令牌

如果我们希望使用代码获取访问令牌以访问或修改资源,则需要为Azure AD应用程序创建标识。此标识称为服务主体。然后我们可以将所需的权限分配给服务主体

如何注册Azure AD应用程序并为该应用程序分配角色,请参阅此

下面是如何使用applicationId和sercet密钥获取访问令牌的演示代码

public static async Task<string> GetAccessToken(string tenantId, string clientId, string clientSecretKey)
    {

        var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
        ClientCredential clientCredential = new ClientCredential(clientId, clientSecretKey);
        var tokenResponse = await context.AcquireTokenAsync("https://management.azure.com/", clientCredential);
        var accessToken = tokenResponse.AccessToken;
        return accessToken;
    }
公共静态异步任务GetAccessToken(字符串tenantId、字符串clientId、字符串clientSecretKey)
{
var context=新的AuthenticationContext(“https://login.windows.net/“+租户);
ClientCredential ClientCredential=新的ClientCredential(clientId,clientSecretKey);
var tokenResponse=await context.AcquireTokenAsync(“https://management.azure.com/“,客户端凭据);
var accessToken=tokenResponse.accessToken;
返回accessToken;
}

简短回答:如果您正在开发一个将使用Azure REST API的C#应用程序,那么为了获得用于身份验证的承载令牌,您确实需要注册Azure AD应用程序(没有办法解决这个问题,因为您需要能够使用任何受支持的OAuth 2.0授权流进行身份验证)


不过,有几种方法可以让您更方便:

  • 使用CLI为RBAC创建服务主体

    在Azure Portal中,单击突出显示的图标打开CLI。

    现在运行下面提到的命令

    az ad sp create-for-rbac -n "MyTestSPForAzureRESTAPIs"
    
    这在一个命令中为您完成了多项任务,并提供了一种开始测试RESTAPI的好方法

    创建的服务主体将作为“参与者”添加到您的Azure订阅中。您可以始终转到订阅>您的订阅>访问控制(IAM),并根据您的要求进行更改

    您将获得一个应用程序ID以及密码/客户机密码,然后可以在C#代码中使用该密码来获取承载令牌

    样本输出

    注意:由于此方法为您提供了客户端机密,因此您应仅从服务器端应用程序(如web API或web应用程序或守护程序服务)使用此方法。请勿在生产场景中使用基于桌面的应用程序(如控制台应用程序或WPF应用程序)或SPA的客户端机密

    我之所以这样说,是因为基于桌面的应用程序或SPA不足以安全地处理客户端机密,并且建议它们使用其他不同的身份验证流。如果您的情况恰好是这些情况中的任何一种,请查看Azure AD应用程序中的委派权限,您可以在其中提示最终用户提供凭据。只需对答案进行评论即可我可以在这些方面添加更具体的指导

  • 在应用程序服务或Azure功能的情况下使用托管身份

    如果您计划使用App Service或Azure功能托管您提到的C#应用程序,那么您可以使用MSI。即使在这种情况下,应用程序也将在Azure AD中创建,但您不需要这样做或管理密钥(定期更改密钥等)。这是一个很好的选择,如果适合您的场景,强烈建议使用

    请阅读此处了解更多详细信息:


此处描述的访问令牌似乎是您正在寻找的承载令牌:Jacob,谢谢您的回答。我似乎不够明确,我需要向Azure资源管理器进行API调用(我更新了问题)。您指出的链接似乎是关于管理API的,他们在那里明确指出,它不能用于对Azure资源管理器的API调用。感谢Rohit的回答!我本来想在我的桌面应用程序中使用服务主体,但将其加密存储在计算机上。该应用程序将解密该机密并使用它。