我已经成功创建了一个Web API,该Web API托管在Azure中并使用AAD承载令牌身份验证进行保护,以允许客户端应用程序(目前仅是我构建的测试控制台应用程序)对其进行访问。
已经暴露出一个要求,即最终客户端应用程序(Sharepoint)的用户将分为两个独立的组-其中一个将限制对API某些区域的访问。
我的老板已规定API应该处理所有身份验证,因此我需要换出当前的Azure Active Directory承载身份验证中间件,并用(我认为)开放ID连接身份验证代替。
我在组合解决方案时遇到了一些困难,因为我不清楚如何/是否可行。我一直在查看the provided sample,但看不到如何利用它。在该示例中,用户直接登录该站点,但是在我的设置中,他们没有登录API,而是登录到Sharepoint,然后调用该共享点-API如何使用
[Authorize(Roles = "Admin")]
没有任何“已登录用户”概念的属性。
答案 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