jan*_*oni 5 azure-active-directory asp.net-core azure-ad-msal
我有一个使用 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);
Run Code Online (Sandbox Code Playgroud)
概念
您描述流程的方式看起来像是您正在使用从客户端到 Web 服务的令牌直接代表用户调用 Microsoft Graph API。这对于流程来说是不正确的。
一旦您根据传入令牌在 Web 服务中对客户端进行了身份验证,那么 Web 服务应该代表用户获取专门用于 Microsoft Graph 的新令牌(使用第一个令牌)。
请参阅此处的流程的更详细说明Azure Active Directory v2.0 和 OAuth 2.0 代表流程
代码示例
看一下这个代码示例。它非常接近您想要实现的目标。
这里,WPF 应用程序首先调用 ASP.NET Core Web API,API 随后代表用户调用 Microsoft Graph。
调用 Microsoft Graph 的 ASP.NET Core 2.1 Web API,本身是使用 Azure AD V2 从 WPF 应用程序调用的
代码中需要注意的重要部分:
查看 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1997 次 |
| 最近记录: |