【问题标题】:Credentials prompt for access to Azure management APIs凭据提示访问 Azure 管理 API
【发布时间】:2019-01-23 08:29:46
【问题描述】:

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

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

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

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

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

如果我使用Microsoft.Identity.Client(如https://docs.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 有效,但对吗?这是我在网上为 Graph API 范围找到的一个猜测,是前者和 .default 后缀的组合。有这方面的文档吗?
  4. 我最终获得了 JWT 和租户 ID。我找不到将 JWT 与 Fluent 管理 API 结合使用的方法。我的帐户(例如)与 3 个租户或 5 个不同的租户/目录相关联 - 那么我该如何选择?

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

【问题讨论】:

    标签: azure asp.net-core .net-core azure-active-directory


    【解决方案1】:

    AcquireTokenForClientAsync 不会提示用户 - 我猜是因为它正在获取令牌以供应用使用自己的权限进行操作?

    您正在使用OAuth 2.0 client credentials grant 通过应用程序的身份访问网络托管资源。这种类型的授权通常用于必须在后台运行的服务器到服务器交互,无需立即与用户交互。

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

    Azure AD 提供两种服务:Azure AD V1.0 和 Azure AD V2.0。请参考Comparing the Azure AD v2.0 endpoint with the v1.0 endpoint。您不能使用 v1 令牌在 on-behalf-of flow 中获取 v2 的令牌。

    AcquireTokenOnBehalfOfAsync 想要一个 JWT.. 太棒了!我会通过从 AcquireTokenForClientAsync 获得的那个

    如上所述,该函数用于从应用程序中配置的权限获取此应用程序(通常是 Web API)的访问令牌,以便代表使用 OAuth 的用户访问另一个下游受保护的 Web API 2.0 代表流量。所以你不能使用通过Client Credential flow获取的应用令牌。

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

    您使用的是Azure Active Directory v2.0 and the OAuth 2.0 client credentials flow,当向 /token v2.0 端点发送 POST 请求时,范围应为:

    在这个请求中传递给scope参数的值应该是你想要的资源的资源标识符(Application 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 图形 API

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

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


    更新:

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

    使用 Azure AD V1.0 端点,请求被发送到跨所有 Azure AD 租户多路复用的端点:https://login.microsoftonline.com/common。当 Azure AD 在 /common 终结点上收到请求时,它会将用户登录并因此发现用户来自哪个租户。参见文档here。但在这个场景中,你只能使用工作和学校帐户(AAD)帐户登录。

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

    【讨论】:

    • 谢谢!那么提示用户然后使用 Azure 管理 API 的正确或标准化方法是什么?当我还不知道租户 ID 是什么时,如何在身份验证期间指定租户 ID?您是否碰巧知道如何使用 Fluent API (github.com/Azure/azure-libraries-for-net) 来实现这些功能?我知道这些问题很多,抱歉:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2022-12-28
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多