首页 > 解决方案 > 带有 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;
    }
},

...但我不知道如何获得令牌。也许从一开始就是错误的,我需要另一种方法?

标签: c#azureasp.net-web-api2azure-ad-b2c

解决方案


客户的令牌不能用于调用 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


推荐阅读