如何配置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 过期时用户注销也是可以接受的。 我们该如何配置呢?
刷新认证cookie,需要重新登录或注销并重新认证。
一般来说,
/auth/login/<PROVIDER>
端点会触发重新认证并生成新的令牌。身份验证令牌设置为在定义的时间段后过期(例如,一小时令牌为 45 分钟)。
当身份验证 cookie 过期时,Azure 静态 Web 应用不会自动注销用户。为了解决这个问题,您可以实现一种机制来检测过期并在前端或后端强制注销。
我参考了这些 MSDOC 1 和 2 在 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"
}
]
}