为用户而不是服务主体获取Azure令牌

问题描述 投票:0回答:1

我有一些只能由用户测试的场景;服务主体是不够的。 (例如,对于经典管理员而言)。我已经创建了一个测试租户/订阅,并拥有一个经典管理员用户,并且已关闭2FA。我想在自动测试中使用该用户,但在获取用户令牌时遇到了麻烦。

这是我尝试过的代码:

var authority = "https://login.windows.net/{tenant}/oauth2/authorize";
var resource = "https://management.core.windows.net/";

var clientCredentials = new ClientCredential(clientId, password);
var context = new AuthenticationContext(authority);
var token = await context.AcquireTokenAsync(resource, clientCredentials).ConfigureAwait(false);
return token.AccessToken;

对于clientId,我使用的是用户的appId,对于密码,我只是使用的是他们用于登录的用户的普通密码。我收到一个错误,提示密码是无效的。我尝试使用电子邮件/ oid代替appId,但是随后出现一个错误,提示找不到该用户。我也尝试过将权限切换到这两者,但这只给出了相同的错误:

https://login.microsoftonline.com/common

https://login.windows.net/{tenant}

还有其他需要做的事情吗?我尝试过在线搜索,发现一些使用UserPasswordCredential的旧示例,但似乎对我来说并不存在,而且AcquireTokenAsync仍然只需要ClientCredential

c# azure .net-core asp.net-core-2.0
1个回答
0
投票

抱歉,您不清楚想要什么。该代码用于获取服务主体的令牌,因此指定用户名和密码将不起作用,它应该是您的应用程序ID(在Azure广告应用程序下)和那里的秘密。

var clientCredentials = new ClientCredential(SHOULD_BE_AZURE_AD_APPLICATION_ID, SECRET_GENERATED_FOR_IT);

而且,权限应该是

var authority = "https://login.microsoftonline.com/{tenant}";

如果您要为特定用户检索令牌,则应该这样做:

result = await context.AcquireTokenAsync(resource, clientId, new UserPasswordCredential("[email protected]", johnsPassword));
© www.soinside.com 2019 - 2024. All rights reserved.