我有一个包含多个较小应用程序的平台。每个应用程序都需要自己的角色,并且用户可能有多个角色,因为他们可能需要访问平台上的不同应用程序。
我有一个 .NET 6 Web API,当前使用 Azure 上的应用程序角色来处理授权。它变得非常混乱,因为我必须为每个应用程序管理多个 Azure 组,例如“应用程序 1 管理员”、“应用程序 1 用户”、“应用程序 2 管理员”、“应用程序 2 用户”等。我想移动授权部分改为数据库(使用诸如 AspNetRoles 之类的东西)。这样,我就不必在 AD 上为每个角色和应用程序创建一个新组并向其中添加用户。相反,我有一个“用户管理”页面,在我自己的平台上分配角色。
目前,我有一种使用
OnTokenValidated
将 Azure 用户及其信息添加到数据库的工作方法。我还创建了自己的 Roles
表,以及将数据库中的 Azure 用户映射到角色的 UserRoles
表。如何通过 [Authorize(Roles = "App1.Admin, App1.User"]
属性而不是 Azure AD 角色来利用这些角色?我首先想到我可以在 OnTokenValidated
中向用户添加声明,但后来我遇到了一些关于此的资源,例如:
对现有 ASP.NET Core Identity 应用程序进行 Azure AD 身份验证
我像这样使用 Microsoft Identity:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration, "AzureAd");
我尝试遵循此示例。我进行了更改以生成
AspNet
表并添加了 DI 等。但是,我的应用程序仍然从 Azure AD 进行授权。有人还提到,可以在“AzureAd”下的 appsettings.json 中使用 "CookieSchemeName": "Identity.External"
自动创建 AspNetUser,但没有创建任何内容。
这里最好的举动是什么?我认为一种选择可能是创建一个自定义授权属性,该属性也检查数据库中的用户角色。我可以做些什么来利用正常的
[Authorize]
属性吗?
我个人会推荐您发布的链接中的方法,它拥有实现使用基于角色的策略进行授权的目标所需的所有基础设施。 只要每个应用程序都可以访问定义身份表的数据库。
RoleManager(Docs)为您处理所有服务,即创建、删除等。
然后,您还可以使用 UserManager (Docs) 检查用户是否在角色数据库中拥有角色: UserManager.IsInRoleAsync(TUser user, string role);如果您想最终在自定义授权三元组中添加更复杂的逻辑(需求-处理程序-策略)
我还强烈推荐这个有关 .NET COre 中的身份验证和授权的 YouTube 系列。它深入探讨了主题,包括自定义、基于角色、基于声明等授权。