【发布时间】:2020-07-10 22:01:31
【问题描述】:
我们有一个运行 AngularJS 单页应用程序 (WebApp) 的 AppService 和一个运行 .Net 服务 (Service) 的 AppService。
WebApp 提示用户登录并获取不记名令牌以便能够向服务发出请求。如果我复制不记名令牌并在 Postman 中使用它,我可以直接向服务发出请求。
如果我尝试向服务直接请求令牌,我会收到提示,我需要租户管理员同意,因此所有身份验证都是通过 WebApp AAD 注册完成的。
我正在尝试以编程方式向服务发出请求。我没有使用用户名和密码,而是在我们的 AAD 应用程序注册中为 WebApp 添加了一个客户端密码。使用该秘密,我可以获得具有https://tenant.onmicrosoft.com/Service/.default 范围的不记名令牌,但我有点困惑,因为该令牌在 PostMan 中不起作用。我认为令牌是用于 WebApp 而不是服务的,我必须以某种方式使用它来获取服务令牌。
我尝试了一个简单的页面,该页面会生成一个工作令牌(我可以在 Postman 中使用),尽管这需要用户名和密码登录。 JavaScript 代码是:
window.config = {
clientId: 'WebApp client id',
tenant: 'Tenant id',
redirectUri: 'http://localhost:3000',
extraQueryParameter: 'nux=1',
popUp: true,
endpoints : {
'prod':
'Service client id'
}
};
var user = authContext.getCachedUser();
if (!user) {
authContext.login();
return;
}
var cachedToken = authContext.getCachedToken(window.config.endpoints.prod);
if (!cachedToken) {
authContext.acquireToken("**Service client id**", function(error, token) {
console.log(error);
console.log('Token:'+token);
});
}
console.log(cachedToken);
var t = document.getElementById("token");
t.innerText = cachedToken;
在 localhost:3000 上运行它会生成一个可在 Postman 中使用的令牌。
现在我正在尝试使用 MSAL.net 以编程方式执行此操作。运行AcquireTokenForClient 时,我得到一个不记名令牌,但它不起作用。我不知道如何使用我的 WebApp 令牌获取服务令牌,AcquireTokenOnBehalfOf 需要用户凭据。我也无法直接从服务获取令牌,因为我收到了需要管理员同意的错误。
result = app.AcquireTokenForClient(scopes)
.ExecuteAsync().Result;
// the token in the result does not work in postman
我认为 WebApp AAD 应用程序注册是唯一获得管理员同意的 -Granted for Tenant 是检查给定用户是否应该有权访问该应用程序,然后如果他们被允许,则获取服务的令牌代表该用户。
是否可以使用客户端密钥获取该令牌,或者我们是否需要在 AAD 中创建一个虚拟用户帐户,该帐户将由所有需要直接向服务发出请求的应用共享?
【问题讨论】:
标签: azure oauth azure-active-directory azure-web-app-service