带有WebApi2-的Azure AD B2C在身份验证后调用GraphAPI

时间:2018-11-30 14:43:30

标签: c# azure asp.net-web-api2 azure-ad-b2c

我有一个WebApi2应用,该服务器用作我的应用前端的api。现在,我想使用AD B2C来管理我的用户-假设我想通过他们的角色(管理员或客户)来区分他们,为此,我相应地创建了两个b2c用户组。当用户登录时,我想为具有不同角色(组)的用户显示不同的内容。

我正在使用this example在我的WebApi2项目中设置Startup.Auth.cs

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;
    }
},

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

1 个答案:

答案 0 :(得分:0)

不能使用客户令牌来调用AADGraph / MSGraph Apis。为了自动获取令牌以调用图形api,我们需要仅应用访问权限。我们需要在租户中配置一个应用程序,该应用程序的凭据用于获取令牌。然后,该令牌可用于调用memberOF Api(或其他需要或需要用户信息的其他api)

此处是有关在B2C依赖服务中如何调用AAD Graph API的示例和说明。 https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet