首页 > 解决方案 > 如何使用 MSAL 代表使用 AAD v1 的用户获取访问令牌?

问题描述

我有一个 Web 应用程序 (Angular 7),它使用MSAL Angular对 Azure AD 用户进行身份验证,并获取访问令牌以访问我的 Web API (.NET 4.6)。这两个应用程序都已在 Azure 门户中注册,具有以下权限,如下所述

现在我想使用 ADAL for .NET 从 Web API 调用 Microsoft Graph,以代表用户获取一些数据。

按照这个说明我应该配置consentScopesprotectedResourceMap但由于我使用 AAD v1,我不能在增量同意的情况下使用范围。

我应该如何配置我的 Web 应用程序以获取 Web API 和 MS Graph 的访问令牌?

发现可以使用 MSAL.js 获取 AAD v1.0 的令牌(并且我能够与我的 Web API 进行通信),但我不知道如何配置它以代表用于通信 Web 的流带有 MS Graph 的 API。

更新

以下是从 Web API 发出访问令牌请求的代码:

string accessToken = null;
var userAssertion = new UserAssertion(
    <userAccessToken>, 
    "urn:ietf:params:oauth:grant-type:jwt-bearer", 
    userName);
var authority = "https://login.microsoftonline.com/" + <tenant> + "/";
var clientCredencial = new ClientCredential(<clientId>, <clientSecret>);
var authContext = new AuthenticationContext(authority, null);

try
{
    var authResult = await authContext.AcquireTokenAsync(
        "https://graph.microsoft.com", 
        clientCredencial, 
        userAssertion);
    accessToken = authResult.AccessToken;
}
catch (AdalServiceException ex) { throw; }

Web App在 Web API 清单中添加为knownClientApplications :

"knownClientApplications": [
    "<WebAppAppId>"
],

这些是在 Web App (MsalModule) 中设置的范围:

consentScopes:
[
    'https://webapi.example.com/user_impersonation'
],

在这种情况下,Web App 在同意屏幕上需要以下权限:

如果我尝试获取 MS Graph 的访问令牌,则会收到错误消息:

{“AADSTS65001:用户或管理员未同意使用 ID 为“WebApiClientId”、名为“WebApiAppName”的应用程序。为此用户和资源发送交互式授权请求。}

标签: c#azure-active-directorymicrosoft-graph-apiadalmsal

解决方案


如错误消息所示,您缺少的是对 Web API 代表登录用户访问 Microsoft Graph 的同意。

假设您已将 Web API 的应用注册配置为需要 Microsoft Graph 的适当委派权限,您可以通过三个选项来提供所需的同意。

  1. 从 Azure 门户提供管理员同意。如果这仅用于您的租户,则租户管理员可以简单地导航到 Web API 的应用程序注册,并授予管理员对所需权限的同意。(有关屏幕截图和更多详细信息,请参阅此答案的选项 1。 )

  2. 通过构建适当的 URL 提供管理员同意。使用门户授予管理员同意的另一种方法是构建同意 URL。在这种情况下,您将为 Web API 构建同意 URL。(有关屏幕截图和更多详细信息,请参阅此答案的选项 2。 )

  3. 在运行时,在同意 Web App 期间,利用knownClientApplications. 如果将AppIdWeb App添加到Web APIknownClientApplications的应用注册清单中的列表中,当要求用户同意 Web App 时,还会提示他们同意 Web API 还需要的任何权限。如果您使用 v2 端点登录到 Web 应用程序(听起来像您),则此方法仅在客户端请求默认范围(即预注册权限,例如)时才有效。https://my.api.example.com/.default


推荐阅读