关于AzureRM与C#结合开发的若干技术问题咨询
问题解答
1. Graph API获取的UserID是否可用于AzureRM场景
完全可以,不存在兼容问题。你从Graph API拿到的用户id字段,和Azure Resource Manager(也就是你提到的AzureRM)体系内的用户主体ID是同一个Entra ID(原Azure AD)全局唯一标识符,所有ARM接口要求传入用户ID的场景都可以直接使用这个值。
2. AzureRM(ARM)场景下C#实现az login等价逻辑
不用单独实现登录逻辑,微软官方提供了统一的身份验证库Azure.Identity,可以同时支持调用Graph API和ARM API,完全覆盖你单租户应用的需求,比自己拼接认证逻辑安全且稳定。
你需要先安装对应的NuGet包:
Azure.Identity:统一身份凭证库Azure.ResourceManager:ARM核心SDKAzure.ResourceManager.Resources:订阅、资源组等基础资源操作SDK
交互式登录(和az login弹浏览器登录效果完全一致)示例代码:
using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Resources; // 单租户场景指定租户ID var tenantId = "你的单租户ID"; // 初始化交互式登录凭证,会自动弹出浏览器让用户登录 var credential = new InteractiveBrowserCredential(new InteractiveBrowserCredentialOptions { TenantId = tenantId }); // 初始化ARM客户端 ArmClient armClient = new ArmClient(credential);
如果你需要用非交互式的自动登录(比如服务账号场景),可以换成ClientSecretCredential(服务主体密钥登录)、ManagedIdentityCredential(托管身份登录)等凭证类,用法完全一致,不需要修改后续的业务调用代码。
3. C#获取ARM Auth Token、拉取订阅信息
用上面初始化好的credential对象就能直接获取ARM的token,拉取订阅也可以直接用ARM SDK的原生方法,不需要自己调用接口:
获取ARM Token示例:
// ARM API的固定scope var armScope = new[] { "https://management.azure.com/.default" }; var tokenResult = await credential.GetTokenAsync(new Azure.Core.TokenRequestContext(armScope)); string armAuthToken = tokenResult.Token;
拉取当前登录账号所有可用订阅示例:
await foreach (SubscriptionResource subscription in armClient.GetSubscriptions().GetAllAsync()) { Console.WriteLine($"订阅名称:{subscription.Data.DisplayName},订阅ID:{subscription.Data.SubscriptionId}"); }
4. 认知纠正和学习方向
- 你提到的AzureRM PowerShell模块已经在2024年2月正式停止维护,对应的C#老版
Microsoft.Azure.Management.*系列SDK也已废弃,建议直接使用新版Azure.ResourceManager系列SDK进行开发,避免踩停止维护组件的坑。 Azure.Identity是微软官方统一的Azure服务身份验证库,不管是调用ARM、Graph、Azure存储、Azure SQL等所有Azure服务的API,都可以用同一个凭证对象获取对应服务的token,不需要为不同API做多套登录逻辑,是所有Azure C#开发的基础组件,建议优先熟悉这个库的用法。- 单租户场景下,所有API的身份体系都基于Entra ID,不存在Graph和ARM两套用户体系的差异,二者可以完全协同使用,不需要做ID转换之类的额外操作。
内容的提问来源于stack exchange,提问作者Brandon Cross
相关产品推荐
相关产品推荐

