我有一个使用MSAL从Azure AD获取访问令牌的应用。这是在具有自己的Azure应用注册表的客户端上完成的。然后,我将此访问令牌传递给服务器,然后服务器调用Microsoft Graph代表用户获取其他信息。但是,当我进行图形调用时,我得到的观众不匹配失败。这似乎是适当的,但是现在我不确定如何将Web服务器受众ID添加到令牌中。
首先,这是这种情况下正确的工作流程吗?我正在使用MSAL对用户进行身份验证,然后使用Web服务进行调用以获取更多信息。 其次,如果使用AzureADBearer,是否可以向访问令牌中添加多个访问者?我知道JWTBearer可以实现。
//web service
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(options =>
{
Configuration.Bind("AzureAd", options);
})
.AddCookie(options => options.Cookie.SameSite = SameSiteMode.None);
答案 0 :(得分:1)
概念
描述流程的方式似乎就像是使用从客户端到Web服务的令牌直接代表用户调用Microsoft Graph API一样。这代表流程是不正确的。
一旦您已经基于传入令牌在Web服务中对客户端进行了身份验证,则应该假定Web服务代表用户(使用第一个令牌)获取一个专门用于Microsoft图形的新令牌。
在Azure Active Directory v2.0 and OAuth 2.0 On-Behalf-Of flow
中查看有关流程的更详细说明代码示例
看看此代码示例。它与您要达到的目标非常接近。
这里,WPF应用程序首先调用ASP.NET Core Web API,然后该API代表用户调用Microsoft Graph。
要从代码中注意的重要部分:
查看TodoListController.cs,其中API首先代表用户获取一个新的AccessToken,传入所需的范围,然后使用此新令牌来调用Microsoft Graph API。
public async Task<string> CallGraphApiOnBehalfOfUser()
{
string[] scopes = { "user.read" };
// we use MSAL.NET to get a token to call the API On Behalf Of the current user
try
{
string accessToken = await _tokenAcquisition.GetAccessTokenOnBehalfOfUser(HttpContext, scopes);
dynamic me = await CallGraphApiOnBehalfOfUser(accessToken);
return me.userPrincipalName;
}