c# - 带有 WebApi2 的 Azure AD B2C - 在身份验证后调用 GraphAPI
问题描述
我有一个 WebApi2 应用程序,它作为我的应用程序前端的 api 服务。现在我想使用 AD B2C 来管理我的用户——假设我想通过他们的角色(管理员或客户)来区分他们,为此我相应地创建了两个 b2c 用户组。当用户登录时,我想为具有不同角色(组)的用户显示不同的内容。
我正在使用此示例Startup.Auth.cs
在我的 WebApi2 项目中进行设置:
var tvps = new TokenValidationParameters
{
ValidAudience = clientId,
AuthenticationType = signUpSignInPolicy,
};
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(String.Format(aadInstance, tenant, defaultPolicy))),
});
从我读到的内容来看,b2c 目前不会在索赔中返回用户的群组。有人建议我在获取令牌后需要调用 GraphApi 来获取这些组并将它们添加到用户的声明中:
private static async Task<string> GetGroups(string token, string userId)
{
using (var client = new HttpClient())
{
var requestUrl = $"https://graph.microsoft.com/v1.0/users/{userId}/memberOf?$select=displayName";
var request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await client.SendAsync(request);
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
}
这就是我卡住的地方。如何注入我的代码以获取调用图的令牌?我搞砸了OAuthBearerAuthenticationOptions.Provider
:
Provider = new OAuthBearerAuthenticationProvider
{
OnValidateIdentity = (context) =>
{
// var token = ??
// var userId = <get from context's claims>
// var groups = GetGroups(token, userId);
// <add to claims>
return Task.CompletedTask;
}
},
...但我不知道如何获得令牌。也许从一开始就是错误的,我需要另一种方法?
解决方案
客户的令牌不能用于调用 AADGraph/MSGraph API。要获得令牌以自动方式调用图形 API,我们需要仅应用程序访问。我们需要在租户中配置一个应用程序,其凭证用于获取令牌。然后,该令牌可用于调用 memberOF Api(或任何其他需要或需要用户信息的 API)
以下是如何在 B2C 依赖服务中调用 AAD Graph api 的示例和说明。 https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet
推荐阅读
- c# - ASP.NET MVC 当前对 X 的请求不明确
- kotlin - 将数据类序列化为 json 总是导致 null
- sql - SQL表行号列?
- c++ - 惰性评估依赖类型 (CRTP)
- c# - 如何关闭窗口但应用程序仍处于活动状态?
- c# - 使用来自外部 Web 服务的哈希和签名通过 iText sharp 签署 PDF
- c++ - 在我的情况下,我需要销毁单例实例吗?
- regex - 正则表达式在字符串中有一个强制字符
- gyroscope - 无法使用 watchOS 5 获取核心运动更新:“[Gyro] Manually set gyro-interrupt-calibration to 800”
- php - PHP:如何发送 ssh 命令而不是等到它执行?