凭据提示访问Azure管理API

时间:2019-01-23 08:29:46

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

我一直在使用Azure流利的管理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。我找不到一种将Fluent Management API与JWT结合使用的方法。.例如,我的帐户与3个租户或5个不同的租户/目录关联-那么我该如何选择?

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

1 个答案:

答案 0 :(得分:1)

  

AcquireTokenForClientAsync不会提示用户-我猜是因为它正在获取应用程序令牌以使其具有自己的权限?

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

  

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参数传递的值应该是所需资源的资源标识符(应用程序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,但是除非在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所示。