AAD API基于角色的身份验证

时间:2019-10-14 10:24:43

标签: azure active-directory azure-active-directory openid-connect azure-api-apps

我已经成功创建了一个Web API,该Web API托管在Azure中并使用AAD承载令牌身份验证进行保护,以允许客户端应用程序(目前仅是我构建的测试控制台应用程序)对其进行访问。

已经暴露出一个要求,即最终客户端应用程序(Sharepoint)的用户将分为两个独立的组-其中一个将限制对API某些区域的访问。

我的老板已规定API应该处理所有身份验证,因此我需要换出当前的Azure Active Directory承载身份验证中间件,并用(我认为)开放ID连接身份验证代替。

我在组合解决方案时遇到了一些困难,因为我不清楚如何/是否可行。我一直在查看the provided sample,但看不到如何利用它。在该示例中,用户直接登录该站点,但是在我的设置中,他们没有登录API,而是登录到Sharepoint,然后调用该共享点-API如何使用

[Authorize(Roles = "Admin")]

没有任何“已登录用户”概念的属性。

1 个答案:

答案 0 :(得分:1)

要调用api,您需要提供包含权限的访问令牌。

这是代码段供您参考。

// Because we signed-in already in the WebApp, the userObjectId is know
                string userObjectID = (User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;

                // Using ADAL.Net, get a bearer token to access the TodoListService
                AuthenticationContext authContext = new AuthenticationContext(AzureAdOptions.Settings.Authority, new NaiveSessionCache(userObjectID, HttpContext.Session));
                ClientCredential credential = new ClientCredential(AzureAdOptions.Settings.ClientId, AzureAdOptions.Settings.ClientSecret);
                result = await authContext.AcquireTokenSilentAsync(AzureAdOptions.Settings.TodoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

                // Retrieve the user's To Do List.
                HttpClient client = new HttpClient();
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, AzureAdOptions.Settings.TodoListBaseAddress + "/api/todolist");
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
                HttpResponseMessage response = await client.SendAsync(request);

参考:

Call a web API in an ASP.NET Core web app using Azure AD

How to: Add app roles in your application and receive them in the token

Using groups vs using application roles for authorization in Azure AD apps