【问题标题】:How to acquire a user based token from Azure Graph API如何从 Azure Graph API 获取基于用户的令牌
【发布时间】:2015-09-28 17:09:25
【问题描述】:

我有一个 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;
}

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

【问题讨论】:

    标签: azure azure-active-directory azure-ad-graph-api


    【解决方案1】:

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

    【讨论】:

    • 那么我们如何在需要带有用户上下文的图形令牌的情况下进行自动化 API 测试?我们需要一种方法来获取给定 Azure Ad object_Id 的令牌,以便它可以通过我们的 Api 的 Authz ...
    • 如果您的 web api 的客户端是本地客户端,您可以使用 u/p 流来获取调用 API 的第一个令牌 - 用于图形的令牌是从第一个令牌中获得的。
    【解决方案2】:

    AcquireToken 有另一个重载,它接受一个 UserCredential 对象,U 假设您可以使用它(您需要 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,我不确定使用我粘贴在此处的代码如何/是否可以使用,但试一试...

    【讨论】:

    • 上面的代码不应该与机密客户端一起使用(例如,任何只有一个凭据的东西,比如这里提到的 Web API)。它不应该适用于机密客户,如果它有任何机会,它很快就会停止工作。我将为预期的服务端流程提供替代答案
    • 这对我们来说很好用,我们在所有集成测试中都使用它来获取用户令牌......虽然我还没有在多租户场景中测试过......
    • Aram,您使用的是本地客户端还是 Web 客户端?正如我在上面和另一个答案中提到的,用户名/密码流应该只适用于本机客户端(有限制)。在某些情况下,它也适用于机密客户端(网络应用程序),但不受支持,此类情况将很快得到修复 - 例如,它将不再有效。
    • 在我的例子中,我们在自动化测试项目中使用它,我们需要获取用户令牌才能调用我们的 Api...
    • 在我们的例子中,我们需要在单元测试中获取第一个令牌才能测试 Web Api
    猜你喜欢
    • 2023-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多