如何从 Azure Graph API 获取基于用户的令牌

How to acquire a user based token from Azure Graph API

我有一个 Azure Active Directory,在我的 Web Api 我有一段代码,我可以使用我在 Azure 注册的应用程序从 Azure Graph Api 获取令牌,并且客户证书。 这是我现在使用的代码:

public static string AcquireServiceToken()
{
    var authority = string.Format(_authority, "common");
    var authContext = new AuthenticationContext(authority);

    var result = authContext.AcquireToken(_serviceTokenResourceId, new ClientAssertionCertificate(_serviceTokenClientId, GetClientCertificate(_certThumbprint)));
    return result.AccessToken;
}

这段代码工作得很好,现在我需要的是一个更具体的令牌,它具有登录用户的上下文,所以基本上我需要能够传入用户名和密码并取回 Graph 令牌来自蔚蓝。 有什么想法吗?

AcquireToken 有另一个接受 UserCredential 对象的重载,你假设你可以使用它(你将需要你需要为其获取令牌的用户的 Active Directory 的 TenantId)

您的函数将如下所示:(请使用您自己的应用程序信息填写 _variables)

public static string AcquireTokenWithoutUserCredentials(string userName, string password)
{
    var authContext = new AuthenticationContext(string.Format(_authority, _userTokenTenantId));
    var userCreds = new UserCredential(userName, password);
    var result = authContext.AcquireToken(_resourceId, _userTokenClientId, userCreds);
    return result.AccessToken;
}

查看您的代码,您似乎有一个多租户场景,其中您使用 "common" 作为 TenatName,我不确定 how/if 它是否可以使用我粘贴的代码在这里但试一试...

Web API 可以通过代理流程获取新令牌,以当前用户身份访问另一个 Web API(在本例中为 Graph)。有关示例,请参见 https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof。不建议直接使用用户名和密码,永远不要在 Azure AD 自己的页面之外收集凭据,在这种特定情况下它不会工作(或将很快停止工作)