我正在使用 Azure 静态 Web 应用的内置自定义身份验证(又名 Easy Auth)。 我想在身份验证后更新用户表。 是否有任何在身份验证后触发的内置事件可以为此目的挂钩?
我目前只能想到一个解决方法:
显然,从代码库复杂性(额外的页面和额外的查询字符串参数)、用户体验(额外的重定向)和处理效率的角度(简单地将令牌存储中已有的内容传递回服务器)来看,上述内容并不是最优的。
我记得使用 OIDC 身份验证时,有一个针对 ASP.Net Core 的 OnTokenReceived 回调。 静态网络应用程序是否有类似的功能?
是的,您可以使用内置功能来管理授权请参阅此处的文档在“管理角色”->“功能(预览)”选项卡下。
它允许您通过将其添加到配置文件中来选择 api 端点,您将看到这些文档是否
{
"auth": {
"rolesSource": "/api/GetRoles",
"identityProviders": {
// ...
}
}
}
在成功进行身份验证后,将调用 api,并传入 /.auth/me 响应对象的 clientPrincipal 对象。您的 api 需要返回您想要为用户提供的任何角色,但您可以执行您需要执行的任何其他操作函数中还有该用户的信息。我使用了托管的 Azure 功能,它运行得很好。
我发现这篇博文对于使用 Entra ID 和 Azure 安全组进行角色设置自定义身份验证和授权非常有帮助。 https://johschmidt42.medium.com/role-based-access-control-with-app-roles-in-azure-static-web-apps-f6525d1b7d92
这是我的 GetRoles 函数的内容,如果有用的话:
const { app } = require('@azure/functions');
app.http('GetRoles', {
methods: ['POST', 'GET'],
authLevel: 'anonymous',
handler: async (request, context) => {
const user = await request.json();
const roles = [];
if (user.identityProvider == 'google') {
roles.push('externalvendor');
}
else if (user.identityProvider == 'aad') {
for (const claim of Object.entries(user.claims)) {
if (claim[1].typ == 'roles' || claim[1].typ == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role") {
roles.push(claim[1].val);
}
}
}
return {
jsonBody: {"roles": roles},
headers: {
'Content-Type': 'application/json'
}
};
}
})