【问题标题】:How to use MSAL to get access token on behalf of a user using AAD v1?如何使用 MSAL 代表使用 AAD v1 的用户获取访问令牌?
【发布时间】:2019-04-18 14:15:43
【问题描述】:

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

  • Web 应用程序:user_impersonation 用于 Web API(委托)
  • Web API:User.Read; Mail.Send 用于 MS Graph(委托)

现在我想使用 ADAL for .NET 从 Web API 调用 Microsoft Graph 以获取一些数据 on behalf of a user

this instructions 之后,我应该配置consentScopesprotectedResourceMap,但由于我使用的是AAD v1,因此我无法在增量同意的情况下使用范围。

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

found 可以使用 MSAL.js 获取 AAD v1.0 的令牌(并且我能够与我的 Web API 进行通信),但我不知道如何为 代表与 MS Graph 进行 Web 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 应用程序在 Web API 清单中添加为 knownClientApplications

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

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

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

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

  • 访问 WebAPIName
  • 随时访问您的数据
  • 查看您的基本资料

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

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

【问题讨论】:

  • 如果您的 Web API 接受 v1.0 令牌,您可以尝试使用“graph.microsoft.com”作为 ADAL.NET 中的资源来执行 OBO。另一种方法是更改​​您的 Web API 以接受 v2.0 令牌,并使用 MSAL.NET。这对你来说是一个选择吗?
  • 我尝试使用“graph.miscosoft.com”,但出现错误(请参阅更新后的问题)。
  • 您的 Web API 应用是否具有为 Microsoft Graph 授予的必需权限?如果没有,请转到 Azure AD 中的 Web API 应用注册。> 设置 > 所需权限 > 添加 Microsoft Graph 并选择适当的权限。最后,如果任何权限显示需要管理员同意,请单击授予权限。可能是您选择了正确的权限,但从未授予权限。我说这个是看错误信息。
  • 正如我所说,Web API 具有以下权限:User.Read; Mail.Send。两者都是委托的,所以用户应该同意。

标签: c# azure-active-directory microsoft-graph-api adal msal


【解决方案1】:

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

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

  1. 提供来自 Azure 门户的管理员同意。 如果仅打算在您的租户中使用,则租户的管理员可以简单地导航到 Web API 的应用注册,然后授予管理员对所需权限的同意。 (有关屏幕截图和更多详细信息,请参阅this answer 的选项 1。)

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

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

【讨论】:

  • 我不想授予管理员同意,因为每个用户都应该同意代表他们发送邮件。
  • 登录 url 以 https://login.microsoftonline.com/&lt;tenantId&gt;/oauth2/v2.0/authorize 开头,所以我想这是 v2 端点。我尝试设置 /.default 范围而不是 user_impersonation,但是没有同意屏幕,我无法与 Web API 通信...
  • @FIL 好的,所以选项 3 就是您要找的。您在 Web API 的应用注册中为 Microsoft Graph API 配置了哪些权限?
  • Web API:User.Read; Mail.Send(委托)
  • 尝试重置并删除您迄今为止为 Web 应用授予的所有同意。 (最简单的方法是只删除 Web App 的 ServicePrincipal 对象(例如,删除 Enterprise apps 下的条目,或使用 Remove-AzureADServicePrincipal)。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2020-09-15
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多