使用客户端机密而非用户凭据通过MSAL.Net获取令牌

时间:2020-07-10 22:01:31

标签: azure oauth azure-active-directory azure-web-app-service

我们有一个运行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中创建一个虚拟用户帐户,该帐户将由需要直接向服务提出请求的所有应用共享?

1 个答案:

答案 0 :(得分:1)

对于客户端凭据(例如机密),您可以获取的范围在应用程序注册api权限中标识为“应用程序权限”,而不是“委托权限”,客户端凭据流无法获取委托的权限流。同样,一旦您授予了应用程序许可权,就必须单击“授予租户授权”。否则,您将无法使用它。 我假设您已经为API服务注册了一个应用程序,并为Web应用程序注册了另一个应用程序。

在该服务的appreg中,您将必须在清单中添加一个app角色。当您尝试从网络应用添加api权限时,这将显示应用程序权限。

以下是其中的一些信息:https://joonasw.net/view/defining-permissions-and-roles-in-aad