gpt4 book ai didi

azure - 使用 MSAL 对 Azure 静态 Web 应用中的函数进行授权

转载 作者:行者123 更新时间:2023-12-05 06:09:12 24 4
gpt4 key购买 nike

我正在尝试使用 Azure AD 和 MSAL 对使用 Azure 静态 Web 应用创建和公开的 Azure 函数进行身份验证和授权。如果我将应用配置为使用较旧的 AAD v1 流,但不使用 MSAL,则用户可以成功访问 API。设置/用例:

  • 使用基本 HTML 和 JS 作为 Azure 静态 Web 应用部署和托管的单页应用程序 (SPA)(这是一个演示“Hello World”应用)
  • 该应用使用 MSAL 集成了身份验证。特别是 msal-browser.js 版本 2.6.1。使用以下方式检索身份 token :
msal.PublicClientApplication(msalConfig).loginPopup(loginRequest)

其中 msalConfig 包含:

```
auth: {
clientId: "<CLIENTID>",
authority: "https://login.microsoftonline.com/<TENANT_ID>"
}
```
  • 用户已通过身份验证并返回身份 token 。

  • 静态 Web 应用程序公开了一个示例函数 GetMessage,该函数返回一些虚拟文本

  • 如果函数的路由不 protected ,SPA 可以成功调用函数,并将文本返回到浏览器/SPA

  • 如果通过routes.json保护到函数的路由,则对函数的请求(正确)将返回 401,除非用户经过身份验证和授权。

    {
    "routes": [
    {
    "route": "/api/*",
    "allowedRoles": ["Authenticated"]
    }
    ]
    }

为了通过 MSAL 对用户进行身份验证,我尝试检索放入函数调用的 Bearer header 中的访问 token :

```
async function getAPI() {
const currentAcc = myMSALObj.getAccountByHomeId(accountId);
if (currentAcc) {
const response = await getTokenPopup(silentRequest, currentAcc).catch(error => {
console.log(error);
});
console.log("Got token " + response.accessToken)
const accToke = response.accessToken
const headers = new Headers();
const bearer = `Bearer ${accToke}`;

headers.append("Authorization", bearer);

const options = {
method: "GET",
headers: headers
};


let { text } = await( await fetch('/api/GetMessage',options)).json();
document.querySelector('#name').textContent = text;
}
}

```

token 在 jwt.ms 中检索并验证,但该函数始终返回 403 - 禁止。如果更改范围或用户角色似乎没有什么区别,尽管我可能缺少一个神奇的组合。

如果我调用的函数是 Microsoft Graph,则此过程完美运行 - 即 https://graph.microsoft.com/v1.0/me - 它只是在我们自己的静态网络应用程序功能上失败。我找不到访问 Azure 服务器端日志的方法来了解它可能失败的原因。

使用 AAD v1 流程,即调用 http://APP_URL/.auth/login/aad 效果很好 - 但它不使用访问 token 。它使用名为 StaticWebAppsAuthCookie 的 Cookie(对 APP_URL/.auth/login/aad 的单个调用足以对用户进行身份验证和授权)。可以找到一个例子 here

我了解到 MSAL 是 Azure AD 的发展方向,那么有没有办法通过 MSAL 流向用户授权?具体使用 Azure AD、静态 Web 应用程序和静态 Web 应用程序中公开的函数(不是作为独立的 Azure Function 应用程序)。

最佳答案

我相信,当调用静态 Web 应用程序中包含的 Azure Function API 时,该服务会将其自己的身份验证 token 插入 header 中。如果您依赖 Authorization Bearer header 将 token 从应用程序传递到 api,则它可能会被覆盖。

就我而言,我发送了 token :

{
"typ": "JWT",
"alg": "RS256",
"kid": "{key value}"
}
{
"iss": "https://{domain}.b2clogin.com/{tenant ID}/v2.0/",
"aud": "{client ID}",
...
}

但我的 Azure Functions API 正在接收 token :

{
"typ": "JWT",
"alg": "HS256",
}
{
"iss": "https://{ID}.scm.azurewebsites.net",
"aud": "https://{ID}.azurewebsites.net/azurefunctions",
...
}

此问题正在此处跟踪:https://github.com/Azure/static-web-apps/issues/34

关于azure - 使用 MSAL 对 Azure 静态 Web 应用中的函数进行授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64898846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com