我正在开发一个类似于Visual Studio的Cloud Explorer的工具,它在用户的Azure订阅中执行一组有限的管理和部署任务 .
我被一些与Azure身份验证相关的事情以及应用程序如何将自身表示给Azure而被抛弃了 .
有关Azure身份验证的大多数文档都涉及允许用户针对Azure Active Directory进行身份验证的Web应用程序 . 这不是我的情景 . 虽然我的应用程序必须针对Azure AD对用户进行身份验证(因为所有Azure用户都是),但我的用户是管理员,而不是"users" .
我了解以前执行管理任务的软件将被分配一个管理证书,该证书在基于Web的Azure管理门户中单独注册 . 我明白这很好 .
...但是我也理解管理证书几乎已被弃用并被服务主体取代,从安全角度来看本身更有意义(因为它可以实现更细粒度的基于角色的安全性) - 但缺点是存在很多为了使服务管理员能够使用管理软件,需要跳过手动步骤和环节 - 特别是您需要在Azure门户中预先注册您的应用程序 .
我不喜欢这个,因为它大大增加了我正在写的软件的用户摩擦 . 我希望我的软件的行为类似于Visual Studio Cloud Explorer或Azure PowerShell,因为您不需要预先注册任何内容:1 . 只需在桌面上运行该程序; 2.您将获得使用Azure管理员帐户凭据登录的提示 . 3.我的软件软件会列出您订阅的内容,并允许您执行管理任务 .
到目前为止,我实际上已经做了一些事情 - 我执行以下步骤:
-
使用
Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext
对https://login.microsoftonline.com/common
进行身份验证(使用AcquireTokenAsync
表示要查看的webview) . 我使用clientId: "1950a258-227b-4e31-a9cf-717495945fc2"
这是Azure PowerShell clientId . -
使用步骤1中的令牌枚举用户帐户中的租户和订阅 .
-
提示用户从步骤2中下载的列表中选择租户,然后选择订阅 .
-
再次使用相同的
clientId
向https://login.microsoft.com/{tenantId}
(其中从步骤3中检索{tenantId}
)发送新的身份验证请求 .
但是,我不喜欢冒充Azure PowerShell - 微软可以撤销该clientId .
...但是如何注册可用于在步骤1中登录的clientId(当没有 tenantId
或订阅上下文时,因此没有包含服务主体的Azure AD)?
1 回答
实际上,Visual Studio Cloud Explorer还在Azure AD上注册应用程序,并使用Service Management REST来管理Azure订阅 . 当您向Cloud Explorer添加帐户时,您可以使用 Fiddler 来处理请求 .
我们需要开发一个multi-tenant application,它允许来自不同租户的用户使用该应用程序 . 之后,我们可以使用 Common endpoints 而不是您注册应用程序的特定租户ID . 然后,用户使用与Azure订阅关联的帐户登录,并获取 Service Management REST 的访问令牌 . 最后,应用程序可以使用访问令牌管理Azure资源 . 例如,我们可以使用下面的REST列出Azure Sbuscriptions:
有关身份验证服务管理请求的更多详细信息,请参阅here .