使用BreezeJS将身份验证从WebApp传递到WebAPI

时间:2015-05-26 14:21:51

标签: odata breeze asp.net-web-api2 single-page-application azure-active-directory

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

我正在使用ADAL JS库在SPA中进行身份验证,并已成功处理。但是,我无法使用BreezeJS将相同的身份验证传递给WebAPI。我们的WebAPI是OData v3,没有authn,Breeze工作正常。我们已经定制了defaultHttpClient来为DataVersion和MaxDataVersion添加客户头,因为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的一篇文章的评论。但是,这似乎不起作用。需要帮助。

由于 与Hemant

1 个答案:

答案 0 :(得分:0)

在对HTTP请求进行一些修补之后,我发现我们期望传递给服务器的Bearer令牌实际上并没有发生。原因是我们没有在微风中使用ajaxAdapter。我们必须自己添加标题并发送请求。我们在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;