【问题标题】:Acquire token with MSAL.Net using client secret instead of user credentials使用客户端密码而不是用户凭据通过 MSAL.Net 获取令牌
【发布时间】: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


    【解决方案1】:

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

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

    这里有一些关于它的信息:https://joonasw.net/view/defining-permissions-and-roles-in-aad

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2019-12-04
      • 2021-08-31
      • 2018-12-14
      • 2021-09-17
      • 2019-11-09
      • 1970-01-01
      相关资源
      最近更新 更多