使用 BreezeJS 将身份验证从 Web App 传递到 Web API

Passing Authentication from WebApp to WebAPI using BreezeJS

我有两个 Web 应用程序,一个是使用 AngularJS + BreezeJS 的 SPA,另一个是 WebAPI。我们正在 WebAPI 中构建授权,并根据用户访问权限过滤结果。我们希望用户 sign-in 进入 SPA 中的组织 Azure AD,并将相同的身份验证传递给 WebAPI。

我正在使用 ADAL JS 库在 SPA 中进行身份验证并已成功处理。但是,我无法使用 BreezeJS 将相同的身份验证传递给 WebAPI。我们的 WebAPI 是 OData v3,没有身份验证,Breeze 工作正常。我们自定义了 defaultHttpClient 来为 DataVersion 和 MaxDataVersion 添加 customer headers 因为 DataJS 需要它。

var oldClient = OData.defaultHttpClient;

var myClient = {
  request: function (request, success, error) {
    request.headers.DataServiceVersion = '3.0';
    request.headers.MaxDataServiceVersion = '4.0';

    return oldClient.request(request, success, error);
  }
};

OData.defaultHttpClient = myClient;

但是,我不确定如何传递身份验证令牌。

我在 entityManager 中完成了以下操作

var ajaxAdapter = breeze.config.getAdapterInstance("ajax");
ajaxAdapter.defaultSettings = {
  xhrFields: {
    withCredentials: true
  }
};

根据 Ward Bell 对 John Papa 的一篇帖子的评论。但是,这似乎不起作用。需要帮助。

谢谢 赫曼

在对 HTTP 请求进行一些修改后,我发现我们期望传递给服务器的 Bearer 令牌实际上并没有发生。原因是我们没有在 breeze 中使用 ajaxAdapter。我们必须自己添加 header 并发送请求。我们在 Azure AD 中设置了一个应用程序。我们必须为客户端应用程序获取密钥才能从存储中获取令牌。以 "Bearer " 为前缀就可以了。以下是自定义适配器的示例代码:

        var oldClient = OData.defaultHttpClient;

        var myClient = {
            request: function (request, success, error) {
                request.headers.DataServiceVersion = '3.0';
                request.headers.MaxDataServiceVersion = '3.0';
                request.headers.Authorization = "Bearer " + adalAuthenticationService.getCachedToken('<<your AD client app key here>>');
                return oldClient.request(request, success, error);
            }
        };
        OData.defaultHttpClient = myClient;