我一直在使用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),则会遇到一些问题:
AcquireTokenForClientAsync
不会提示用户-我猜是因为它正在获取应用程序具有自己权限的令牌?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
。https://management.azure.com/user_impersonation
显然无效。.https://management.azure.com/.default
有效,对吗?这是我在网上为Graph API范围找到的前者和后缀.default
的组合。有任何文档吗?这就是我尝试过的方法,适当的路线可能会有所不同。总结:我希望.NET Core控制台应用程序请求用户凭据,然后访问他们有权访问的Azure资源,以执行一些资源管理。
答案 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应用程序可以使用:
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所示。