如何在 Azure 静态 Web 应用程序 (SWA) 中刷新身份验证 cookie

问题描述 投票:0回答:1

如何配置auth-cookie的刷新,或者cookie过期时注销用户?

详情:

我们正在使用 Azure SWA 和在 dotnet 8 上运行的 Azure 函数应用程序,该应用程序通过 C# 隔离为后端 API。我们正在使用针对 microsoft entra 版本 1 的自定义身份提供商,例如 https://learn.microsoft.com/en-us/azure/static-web-apps/authentication-custom?tabs=aad%2Cfunction#configure-a -自定义身份提供商

我们使用 Microsoft.Graph v5.61.0 来检索角色。此版本的 Microsoft.Graph 可能存在错误,因为这是检索用户角色的地方。

我们提供了一个客户端主体,我们可以使用它来获取自定义角色,但是用户声明的过期时间为 1 小时,而这似乎在任何地方都没有得到尊重。即 1 小时后没有任何特殊情况发生。重新加载页面、关闭页面等不会更新用户声明。

此外,用户长时间活跃后(我们尝试过24小时),返回的客户端主体不包含自定义角色。用户没有注销或未经身份验证,即使根据 github 上的类似问题,身份验证 cookie 应该在几个小时后过期:https://github.com/Azure/static-web-apps/issues/213 (向下滚动可以看到问题通过线程发生了变化)

重要的是,即使用户登录24小时后也可以返回自定义角色,希望这可以通过刷新auth cookie来实现。否则,如果 cookie 过期时用户注销也是可以接受的。 我们该如何配置呢?

azure-functions azure-static-web-app
1个回答
0
投票

刷新认证cookie,需要重新登录或注销并重新认证。

enter image description here

一般来说,

/auth/login/<PROVIDER>
端点会触发重新认证并生成新的令牌。身份验证令牌设置为在定义的时间段后过期(例如,一小时令牌为 45 分钟)。

当身份验证 cookie 过期时,Azure 静态 Web 应用不会自动注销用户。为了解决这个问题,您可以实现一种机制来检测过期并在前端或后端强制注销。

我参考了这些 MSDOC 12 在 Azure 静态 Web 应用程序中配置和添加身份验证。

示例: 使用以下 URL 注销:

https://<YOUR_SITE>/.auth/logout/aad/callback

或者,您可以包含登录和注销,如下所示

<a href="/.auth/login/aad">Login with Microsoft Entra ID</a>
<a href="/.auth/logout">Log out</a>
.
.
   async function getUserInfo() {
            const response = await fetch('/.auth/me');
            const user = await response.json();
            const pre = document.querySelector('pre');
            pre.textContent = JSON.stringify(user, null, 2);
        }
        getUserInfo();

staticwebapp.config.json
除了 Microsoft Entra 添加以下路线

{
  "navigationFallback": {
    "rewrite": "/index.html",
    "exclude": ["/static/*", "/api/*"]
  },
  "responseOverrides": {
    "401": {
      "rewrite": "/unauthorized.html"
    },
    "404": {
      "rewrite": "/404.html"
    }
  },
  "routes": [
    {
      "route": "/api/*",
      "allowedRoles": ["authenticated", "Admin"]
    },
    {
      "route": "/admin/*",
      "allowedRoles": ["Admin"]
    },
    {
      "route": "/",
      "allowedRoles": ["anonymous"]
    },
    {
      "route": "/login",
      "redirect": "/.auth/login/github"
    },
    {
      "route": "/logout",
      "redirect": "/.auth/logout"
    },
    {
      "route": "/.auth/login/aad",
      "statusCode": 404
    },
    {
      "route": "/purge",
      "redirect": "/.auth/purge/github"
    }
  ]
}

Output with loginand logout

© www.soinside.com 2019 - 2024. All rights reserved.