0

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

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

4

2 回答 2

2

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

于 2015-09-28T17:55:28.763 回答
1

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,我不确定它如何/是否可以使用我粘贴在这里的代码工作,但试一试......

于 2015-09-28T17:23:19.227 回答