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

时间:2018-11-15 13:03:22

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

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

  • 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 API清单中,

Web App被添加为 knownClientApplications

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

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

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

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

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

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

  

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

1 个答案:

答案 0 :(得分:0)

如错误消息所示,您所缺少的是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 App同意的情况下,利用knownClientApplications 。如果您在要求用户同意的情况下,将 Web应用程序的AppId添加到 Web API 的应用程序注册清单的knownClientApplications列表中对于Web App,还将提示他们同意Web API也需要的任何权限。如果您使用v2端点登录Web App(听起来像您一样),则此方法仅在客户端请求默认范围(即,预先注册的权限,例如https://my.api.example.com/.default)时有效。