我计划实现一个C#应用程序,该应用程序将使用REST API(对Azure Resource Manager的API调用)创建Azure资源。调用REST API时,您必须通过传递身份验证标头“ Authorization:Bearer yJ0eXAiOiJKV ...”进行身份验证。
如何获得此不记名令牌?在线查看我发现的所有Web应用程序,就可以使用它的application_id。但是,我没有任何应用程序,也不想创建一个。
我可以复制通过Fiddler拦截的呼叫,但是我认为这不是“推荐”的方式。
有人遇到这个问题并有解决方案吗?
答案 0 :(得分:1)
如果您公正想要获取不记名令牌。我建议您可以在Azure API文档中登录您的帐户。登录后,我们可以获取承载令牌。
如果要使用代码获取访问令牌来访问或修改资源,则需要为Azure AD应用程序创建标识。此身份称为服务主体。然后,我们可以将所需的权限分配给服务主体。
如何注册Azure AD应用程序并为该应用程序分配角色,请参阅此document。
以下是演示代码,如何使用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;
}
答案 1 :(得分:1)
简短答案:如果您要开发要使用Azure REST API的C#应用程序,则为了获取承载令牌进行身份验证,您确实需要进行Azure AD应用程序注册(没有办法解决,因为您必须使用任何受支持的OAuth 2.0授权流进行身份验证)。
不过,有几种方法可以使您更方便:
使用CLI为RBAC创建服务主体
现在运行下面提到的命令
az ad sp create-for-rbac -n "MyTestSPForAzureRESTAPIs"
这可以在一个命令中为您完成多项操作,并且为测试REST API提供了一种很好的入门方法。
创建的服务主体将作为“贡献者”添加到您的Azure订阅中。您始终可以转到“订阅”>“订阅”>“访问控制(IAM)”,然后根据需要进行更改。
您将获得一个应用程序ID以及密码/客户端密码,然后可以在C#代码中使用它来获取承载令牌。
注意:由于此方法为您提供了一个客户机密,因此您应该仅在服务器端应用程序(例如Web API或Web App或Daemon服务)中使用此密码。在生产场景中,请勿使用基于桌面的应用程序(例如控制台应用程序或WPF应用程序)或SPA中的客户端机密。
之所以这样说,是因为基于桌面的应用程序或SPA的安全性不足以处理客户端机密,因此建议为其使用其他不同的身份验证流程。如果您碰巧遇到这种情况,请查看Azure AD应用程序中的委派权限,您可以在其中提示最终用户输入凭据。只需评论一下答案,我就可以针对这些问题添加更具体的指导。
在应用服务或Azure功能的情况下使用托管身份
如果您打算使用App Service或作为Azure函数托管您提到的C#应用程序,则可以使用MSI。即使在这种情况下,也将在Azure AD中创建一个应用程序,但是您不需要这样做或管理密钥(定期更改密钥等)。这是一个不错的选择,如果适合您的情况,强烈建议使用。
在此处阅读更多详细信息: How to use managed identities for App Service and Azure Functions