凭据提示访问Azure管理API



我一直在使用Azure fluent管理API(https://github.com/Azure/azure-libraries-for-net)在.NET Core中取得了一些成功。

但是,我想提示用户为Microsoft帐户输入一些凭据。这些凭据可以访问一个或多个Azure租户/订阅,所以我希望能够使用结果来浏览和管理那里的资源。

这与我认为Azure Data Studio所做的非常接近:你可以输入一些Azure信誉,你的资源将出现在应用程序中。

我正在努力了解这方面的最佳方法。当你谈论Azure AD应用程序注册时,似乎有10亿个网站,但我还没有找到富有成效的特定搜索查询。我知道我可以注册一个应用程序,获取客户端ID和客户端机密。我知道我可以将其设置为可供当前租户或所有租户的组织帐户使用。

我可以将"Azure服务管理(委派权限:user_impersonation)"权限添加到我的应用程序API权限部分,但接下来是什么?

如果我使用Microsoft.Identity.Client(如https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-netcore-daemon),我遇到了一些问题:

  1. AcquireTokenForClientAsync不会提示用户——我想是因为它正在获取应用程序使用自己权限操作的令牌
  2. AcquireTokenOnBehalfOfAsync想要JWT。。太棒了我会通过AcquireTokenForClientAsync考试的!不,AADSTS70002: Error validating credentials. AADSTS500137: The token issuer doesn't match the api version: A version 1 token cannot be used with the v2 endpoint
  3. 我不知道我想要什么范围。https://management.azure.com/user_impersonation显然无效。。https://management.azure.com/.default有效,但对吗?这是一个猜测,前者和.default后缀的组合,我在网上为Graph API范围找到了。有这方面的文件吗
  4. 我最终拿回了JWT和租户ID。我找不到将JWT与Fluent管理API一起使用的方法。。我的帐户(例如)与3个租户或5个不同的租户/目录相关联,那么我该如何选择

这正是我所尝试的,合适的路线可能会有所不同。总之:我希望.NET Core控制台应用程序请求用户凭据,然后访问他们可以访问的Azure资源,以便执行一些资源管理。

AcquireTokenForClientAsync不会提示用户-我想是因为它正在获取应用程序使用自己权限操作的令牌?

您正在使用OAuth 2.0客户端凭据授予,通过使用应用程序的标识来访问web托管资源。这种类型的授权通常用于服务器到服务器的交互,这些交互必须在后台运行,而不需要立即与用户交互。

AADSTS70002:验证凭据时出错。AADSTS500137:令牌颁发者与api版本不匹配:版本1的令牌不能与v2终结点一起使用。

Azure AD提供两种服务:Azure AD V1.0和Azure AD V2.0。请参阅将Azure AD V2.0端点与V1.0端点进行比较。您不能在代表流的中使用v1令牌来获取v2的令牌。

AcquireTokenOnBehalfOfAsync想要JWT。。太棒了我会通过从AcquireTokenForClientAsync 获得的

AS如上所述,该函数用于从应用程序中配置的权限获取此应用程序的访问令牌(通常是Web API),以便代表使用OAuth 2.0 on-behalf-of流的用户访问另一个下游受保护的Web API。因此,您不能使用使用客户端凭据流获取的应用程序令牌。

https://management.azure.com/.default有效,但对吗?这是一个猜测,前者和默认后缀的组合,我在网上为Graph API范围找到。有这方面的文件吗?

您使用的是Azure Active Directory v2.0和OAuth 2.0客户端凭据流,当向/token v2.0端点发送POST请求时,作用域应该是:

此请求中为作用域参数传递的值应该是所需资源的资源标识符(应用程序ID URI),并加上.default后缀。对于Microsoft Graph示例,值为https://graph.microsoft.com/.default.此值通知v2.0端点,在您为应用程序配置的所有直接应用程序权限中,它应该为与您要使用的资源关联的权限颁发令牌。

请检查上述文档中的Get a token部分。

我最终拿回了JWT和租户ID。我找不到将JWT与Fluent管理API一起使用的方法。。

AFAIK,当前Azure AD V2.0应用程序可以使用:

  • 自己的API
  • Microsoft Outlook API
  • Microsoft Graph API

Azure AD V2.0当前不支持Azure管理API。

所以你的问题是,你需要允许Azure AD中的工作和学校帐户,以及与Azure AD V2.0一起使用的个人Microsoft帐户(MSA),但你不能使用Azure管理API。你可以在Azure AD V1.0中使用Azure管理API,但它只允许工作和学校帐户登录到你的应用程序,除非你邀请Microsoft帐户作为Azure AD 1.0中的访客用户,但如果你想在V1.0应用程序中使用MSA登录,你需要配置为在身份验证期间指向租户特定的端点:https://login.microsoftonline.com/{TenantId_or_Name}).


更新:

您可以使用代码流和azure ad v1.0端点,用户将被重定向到AAD的登录页面并输入他们的凭据。这是.net核心的代码示例。

使用Azure AD V1.0端点,请求被发送到跨所有Azure AD租户多路传输的端点:https://login.microsoftonline.com/common。当Azure AD在/common端点上接收到请求时,它会将用户登录,从而发现用户来自哪个租户。请参阅此处的文档。但在这种情况下,您只能使用工作和学校帐户(AAD)帐户登录。

链接中的代码示例正在使用Azure服务主体进行身份验证,没有交互式用户登录。您可以使用OpenID Connect Owin中间件在.net Core应用程序中进行身份验证,如下所示。

最新更新