Azure Wep应用程序和功能凭据不起作用

时间:2019-03-31 11:17:08

标签: javascript azure asp.net-core azure-functions azure-ad-b2c

我目前有一个Wep应用程序(ASP.NET Core 2.2),Azure函数返回JSON“ hi”。没有使用NodeJS。

我已经使用B2C设置了我的Web应用程序和功能,并且分别访问它们时,它们都提示登录并可以正常工作。

更新:如果我访问Web应用程序,先登录然后访问功能url,它会给出响应“ hi”,但除非我手动访问功能url地址,否则Ajax请求将无法正常工作通过Web App登录后手动进行操作。

我的问题是,我从Web应用程序向该功能提出了Ajax请求,但该请求未传递凭据,并且仅当我分别登录Web应用程序和功能时才有效。

我希望获得帮助,以使Web应用程序将其凭据传递给该函数,因此不会出现以下错误:

  

在以下位置访问XMLHttpRequest   'https://xxx.b2clogin.com/xxx.onmicrosoft.com/oauth2/v2.0/authorize?response_type=id_token&redirect_uri=https%3A%2F%2Fxxx.azurewebsites.net%2F.auth%2Flogin%2Faad%2Fcallback&client_id=5e55f7e5-2b51-4a5f-86c0-b7776b2623b2&scope=openid+profile+email&response_mode=form_post&p=b2c_1_signin&nonce=d138edf541d1423e92b99fe7ca400263_20190331110324&state=redir%3D%252Fapi%252FTest%253F_%253D1554029904731'   (重定向自   'https://xxx.azurewebsites.net/api/Test?_=1554029904731')起源   “空”已被CORS政策阻止:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。

 function Test2() {
        console.log("2. Sending request...");
        $.ajax({
            type: "GET",
            cache: false,
            credentials: 'include',
            mode: 'cors',
            url: 'https://xxx.azurewebsites.net/api/Test',
            // contentType: "application/json; charset=utf-8",
            //dataType: "application/json",
            //data: dataValue,
           xhrFields: {
                withCredentials: true
            },
            crossDomain: true,
            success: function (response) {
                console.log('2. Done');
                console.log('2. ' + response);
            },
            failure: function (response) {
                console.log("2. Request: Failed.");
                alert(response.d);
            }
        });
    }

Web应用程序的API设置 The API settings for the Web App

Web应用程序的设置 The settings for the Web App

Web Api的设置 The settings for the Web Api

Web Api的B2C设置 B2C Settings for the Web Api

1 个答案:

答案 0 :(得分:1)

就像提到的CSharpRocks一样,浏览器通过根据域传递正确的cookie来进行身份验证。

但是我想在您的情况下,该功能和webapp具有不同的域名,对吗?这就是为什么您需要先登录到功能应用程序,然后它才能工作。

有多种方法可以解决此问题

  1. 将您的WebApp和功能都放在Azure Application Gateway后面,以便您可以通过一个域名访问它们。这样,浏览器将在前往该自定义域的请求中发送Cookie。
  2. 在WebApp上具有一个端点,该端点将充当Function App的代理。这样,cookie会在初始请求中发送到您的WebApp,您可以将其转发到Function App。
  3. 我假设您有一个MVC应用程序,因此该应用程序可能不适用于您的情况,但对于使用JavaScript SPA以及WebApp API和Functions API的用户,他们可以执行Authorization Code Grant Flow来获取他们将在请求中传递给两个API的访问令牌(使用JS代码,不是自动的)。
  4. 通过委派权限将Function API as a new scope暴露在Azure AD和allow your WebApp to access to this API中。