我们有一个运行AngularJS单页应用程序(WebApp)的AppService和一个运行.Net服务(服务)的AppService。
WebApp提示用户登录并获取承载令牌,以便能够向服务提出请求。如果我复制不记名令牌并在邮递员中使用,则可以直接向服务提出请求。
如果我尝试直接向服务请求令牌,则会提示我需要租户管理员同意,因此所有身份验证均通过WebApp AAD注册完成。
我正在尝试以编程方式向服务提出请求。我没有使用用户名和密码,而是在WebApp的AAD App注册中添加了客户端机密。使用该秘密,我可以使用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上运行它会产生一个在邮递员中可用的令牌。
现在,我正在尝试使用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中创建一个虚拟用户帐户,该帐户将由需要直接向服务提出请求的所有应用共享?
答案 0 :(得分:1)
对于客户端凭据(例如机密),您可以获取的范围在应用程序注册api权限中标识为“应用程序权限”,而不是“委托权限”,客户端凭据流无法获取委托的权限流。同样,一旦您授予了应用程序许可权,就必须单击“授予租户授权”。否则,您将无法使用它。 我假设您已经为API服务注册了一个应用程序,并为Web应用程序注册了另一个应用程序。
在该服务的appreg中,您将必须在清单中添加一个app角色。当您尝试从网络应用添加api权限时,这将显示应用程序权限。
以下是其中的一些信息:https://joonasw.net/view/defining-permissions-and-roles-in-aad