当前位置: 首页 > 知识库问答 >
问题:

如何使用MSAL代表使用AAD v1的用户获取访问令牌?

边国安
2023-03-14

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

  • Web应用程序:user\u模拟for Web API(委派)
  • Web API:<代码>用户。阅读邮政发送MS图表(委派)

现在,我想使用ADAL for从Web API调用Microsoft Graph。NET来代表用户获取一些html" target="_blank">数据。

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

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

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

更新

以下是从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清单中添加为已知的ClientApplication:

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

以下是在Web App(MsalModule)中设置的范围:

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

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

  • 访问WebAPIName

如果我尝试获取MS Graph的访问令牌,则会出现错误:

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

共有1个答案

姬博瀚
2023-03-14

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

假设您已将Web API的应用程序注册配置为要求对Microsoft Graph具有适当的委派权限,则有三个选项可提供所需的同意。

>

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

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

 类似资料:
  • 我能够获得Graph API的有效访问令牌,因为有丰富的示例/文档/教程。 但是,我无法为我的自定义API获取有效的访问令牌。我使用的范围看起来像这样: 使用此作用域,我可以获取访问令牌。不幸的是,它是无效的。随后,当我尝试在自定义 API 上调用某些内容时,我收到未经授权的 401 错误。 甚至有可能使用MSAL acquireTokenSilent在自定义API上请求访问令牌吗?

  • 我有一个SPA应用程序,它使用AAD v2身份验证与我的后端Web API通信。现在我正在开发一个控制台应用程序,代表登录到SPA应用程序的用户调用Microsoft Graph。 我有一个用户的有效访问令牌(用于调用后端Web API)。我想使用这个访问令牌请求一个新的令牌来访问MS Graph。 下面是控制台应用程序的代码,用于使用MSAL.NET请求带有MS图形作用域的新访问令牌: 但是,当

  • 我正在尝试使用 MSAL (1.0.304142221-alpha) 使用客户端凭据流获取微软图形 API 的令牌。我的代码看起来像这样: 第二行引发异常:“AADSTS70011:为输入参数'scope'提供的值无效。范围邮件读取无效。图形 API 引用似乎引用了“邮件.Read”作为所需的范围。 Azure AD中的应用程序是一个具有单个密钥的Web应用程序。应用程序具有Microsoft G

  • 我已经创建了一个webapp类型的Azure AAD应用程序,它具有客户端秘密和重定向URL。现在,我想获得一个访问令牌代表用户使用AAD应用程序。通过查看文档,到目前为止,我得到了以下代码。 但这是我在尝试获取用户令牌时得到的错误,如下所示。 消息“AADSTS70002:请求正文必须包含以下参数:'Client_Secret或Client_Assertion'。\r\n跟踪ID:0E977F6

  • 是否可以使用OAuth 2访问令牌从ForgeRock的OpenAM获取用户详细信息(属于资源所有者的属性)? 我有一个受信任的SPA UI,可以使用资源所有者密码凭据授予类型从OpenAM获取访问令牌。然而,该访问令牌没有提供有关资源所有者的信息。类似地,endpoint没有提供任何信息。 OpenAM似乎有用于列出用户属性的endpoint,但是期望使用JWT作为请求的身份验证手段。 如何从访

  • 问题内容: 我正在尝试使用Flask访问用户代理,但是我找不到有关它的文档,或者它没有告诉我。 问题答案: 您还可以使用包含以下属性的对象,这些属性是基于useragent字符串创建的: 平台(Windows,Linux,MacOS等) 浏览器(chrome,firefox,msie等) 版 语言 字串()