我有一个Web应用程序(Angular 7),该应用程序使用MSAL Angular通过Azure AD对用户进行身份验证并获取用于访问我的Web API(.NET 4.6)的访问令牌。这两个应用程序均已按照here中所述具有以下权限在Azure门户中注册:
user_impersonation
用于Web API(已授权)User.Read; Mail.Send
用于MS Graph(已授权)现在,我想使用ADAL for .NET从Web API调用Microsoft Graph,以获取一些数据on behalf of a user。
在this instructions之后,我应该配置consentScopes
和protectedResourceMap
,但是由于我使用的是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在同意屏幕上需要以下权限:
如果我尝试获取MS Graph的访问令牌,则会收到错误消息:
{“ AADSTS65001:用户或管理员不同意使用ID为'WebApiClientId'的应用程序,名为'WebApiAppName'。为此用户和资源发送交互式授权请求。}
答案 0 :(得分:0)
如错误消息所示,您所缺少的是Web API代表登录用户访问Microsoft Graph的同意。
假设您已经配置了Web API的应用程序注册,以要求对Microsoft Graph具有适当的委派权限,那么您可以通过三个选项来提供所需的同意。
从Azure门户提供管理员同意。如果仅在租户中使用,则租户的管理员可以简单地导航到Web API的应用程序注册,并且授予管理员对所需权限的同意。 (有关屏幕截图和更多详细信息,请参见this answer的选项1。)
通过构建适当的URL来提供管理员同意。使用门户网站授予管理员同意的一种替代方法是构建同意URL。在这种情况下,您将为Web API构造同意URL。 (有关屏幕截图和更多详细信息,请参见this answer的选项2。)
在运行时,在获得Web App同意的情况下,利用knownClientApplications
。如果您在要求用户同意的情况下,将 Web应用程序的AppId
添加到 Web API 的应用程序注册清单的knownClientApplications
列表中对于Web App,还将提示他们同意Web API也需要的任何权限。如果您使用v2端点登录Web App(听起来像您一样),则此方法仅在客户端请求默认范围(即,预先注册的权限,例如https://my.api.example.com/.default
)时有效。