小编Ric*_*ett的帖子

在ADAL JS中使用Azure AD和OAuth2隐式授权对声明进行分组

背景

我们正在Azure中开发一个具有AngularJS前端和Web API后端的多租户SaaS产品.我们使用Azure AD进行身份验证,并使用ADAL JS(使用OAuth2隐式授权)将其连接起来.作为多租户应用程序,我们允许客户针对自己的Azure AD进行身份验证(可能与也可能未连接到内部部署AD).

到目前为止,这一切都很好.ADAL JS将用户带到Azure登录页面,一旦用户通过身份验证,就会发出OAuth2令牌.然后,此JWT令牌随所有API调用一起作为承载令牌发送,我们拥有自己的声明转换过程,用于将来自Azure的传入声明映射到我们的应用程序声明.

我们尝试按AD组进行操作,而不是在声明转换过程中指定单个用户.这允许我们的客户在他们的AD中安装安全组,然后我们的应用程序将使用它来映射到正确的应用程序声明.

问题

我们收到的JWT令牌不包含groups财产,尽管有设置groupMembershipClaimsSecurityGroup在AAD应用程序清单.我从维托里奥的这条推文中读到了一点

隐式授权不会发送这些声明,因为它返回查询字符串中的标记 - 它很容易超过最大长度

经过进一步调查,我还发现Vittorio的这个StackOverflow答案

我验证了,在隐式授权案例中,您将始终通过超额索赔接收组.请参阅https://github.com/AzureADSamples/WebApp-GroupClaims-DotNet/tree/master/WebApp-GroupClaims-DotNet-它将向您展示如何处理超额索赔以检索组.

我查看了JWT令牌,它不包括任何超额索赔(由_claim_names和标识_claim_sources).我肯定是Azure AD中两个组的成员.

我现在似乎还有两个相互矛盾的陈述,即是否有可能在隐式授权令牌中获取组信息(无论是直接还是间接).

问题1:我是否应该获得可用于获取群组信息的超额索赔?如果是这样,我是否需要做任何事情以确保将索赔发送给我?

图API

我是否可以通过图API中的用户链接获得超额索赔,或者我是否必须手动创建链接以获取用户的组,我仍然不确定如何使用图API进行身份验证.

我需要在收到带有承载令牌的请求(来自ADAL JS)后从后端联系图API.

问题2:我可以将相同的承载令牌发送到图形API以读取该用户的目录信息吗?或者我是否需要在应用程序的上下文中直接从我的应用程序到图形API租户而不是用户进行身份验证?

azure angularjs azure-active-directory adal

13
推荐指数
1
解决办法
4006
查看次数

代表应用程序而不是用户访问Azure Graph API

继上一个问题之后:在ADAL JS中使用Azure AD和OAuth2隐式授权进行组声明,我已经设置了一些内容,以便用户可以使用Azure/ADAL JS进行身份验证,然后使用他们的令牌访问Azure Graph API代表那个用户.这很好用,我可以获得他们的用户和组信息.

但是,我们现在有一个用例,其他系统将在应用程序的上下文中而不是作为单个用户登录我们的应用程序.我不知道我是否正确地进行了操作但是我有第二个Azure AD应用程序,其客户端密钥通过从AAD API请求令牌进行身份验证.我可以获得一个令牌并将其传递给我们的应用程序.但是,我不能再使用该令牌代表该用户(现在是应用程序)访问Azure Graph API.

首先,这实际上是可行的,还是我尝试不可能的?

如果有可能,我必须采取哪些不同的方式才能使其发挥作用?它只是Azure应用程序中的权限还是我需要在代码中以不同方式执行?

我用来代表用户访问Graph API的代码(删除了异常处理和空检查)是:

var authContext = new AuthenticationContext("https://login.microsoftonline.com/common");
var clientCredential = new ClientCredential("clientId", "key");
var userAssertion = new UserAssertion(((BootstrapContext)identity.BootstrapContext).Token);

var result = await authContext.AcquireTokenAsync("https://graph.windows.net", clientCredential, userAssertion);
return result.AccessToken;
Run Code Online (Sandbox Code Playgroud)

我得到的例外是AADSTS50034: To sign into this application the account must be added to the {directory ID of my main application} directory错误invalid_grant.

我似乎无法弄清楚我做错了什么,因为我相信所有Azure应用程序都配置正确,至少它们用于用户身份验证.我还将相同的应用程序和委派权限应用于我的第二个Azure AD(客户端)应用程序,其他目录需要用户身份验证.

任何帮助,将不胜感激.

更新:系统概述/配置

所以我似乎没有提供关于系统配置方式的足够上下文,所以让我试着在这里解决这个问题.

我们有一个在Azure中运行的企业SaaS应用程序(我们称之为我们的应用程序).它在Azure AD中有一个"应用程序"(让我们称之为我们的AAD应用程序以避免混淆).这是一个多租户AAD应用程序,用户通过AAD使用OAuth2进行身份验证.

作为企业应用程序,我们的客户都拥有自己的Azure …

azure azure-active-directory adal azure-ad-graph-api

8
推荐指数
1
解决办法
2977
查看次数