使用 ASP.net 身份模型声明来映射数据库中记录之间的关系是否不合适?

Is it inappropriate to use ASP.net Identity Model Claims to map relationships between records in a database?

我知道 ASP.net 身份模型通常用于验证用户是否被允许访问特定资源/端点。我还没有找到任何人做我所做的事的例子,我决定我可能正在走上一条痛苦和背叛的道路。

我有一个示例,说明我正在尝试使用基于索赔的记录查询。

  1. 一个用户请求他所有的客户
  2. 返回我的当前用户是其经理的 clientIds 列表
  3. 我们检索所有这些客户,并获取他们与投资组合相关的声明
  4. 然后我们去检索 x 客户拥有的所有投资组合
  5. 建立响应并将其发送。
public async Task<IList<Client>> GetUserClients(ApplicationUser user)
{
    var claims = await _userManager.GetClaimsAsync(user);
    var clientIds = claims.Where(c => c.Type.Equals(MyClaims.ClientManager)).Select(c => c.Value).ToList();

    var clients = new List<Client>();
    foreach (var clientId in clientIds)
    {
        var clientUser = await _userService.GetUserById(clientId);
        var client = Client.MapFromUser(clientUser);
        
        var clientPortfolioClaims = await _userManager.GetClaimsAsync(clientUser);
        var clientPortfolioIds = clientPortfolioClaims.Where(c => c.Type.Equals(MyClaims.PortfolioViewer)).Select(c => c.Value).ToList();

        foreach (var portfolioId in clientPortfolioIds)
        {
            client.Portfolios.Add(await _userPortfolioService.GetUserPortfolioById(Int32.Parse(portfolioId), ""));
        }

        clients.Add(client);
    }

    return clients;
}

所以我没有使用正常的 RDS 关系或列,而是使用了一个不可执行的关系条目,可能是在滥用方式。

我知道我正在做的事情是可行的,因为它有效...但这是个好主意吗?

您有几个流程需要考虑。

身份验证将用户登录到系统。

授权表明他们一旦访问系统就可以做什么

授权可以按角色划分,但现在经常使用声明的概念。

例如,每个投资组合都与一个索赔相关联。为了使系统更加灵活,可能会有一个单独的请求来读取投资组合、编辑它、打印它等等(您可能想要的任何一般操作)。

然后您将每个声明与一个或多个用户相关联。你晚上只有一个人 owns/edits 从业务角度看投资组合,但其他人也许可以看看它。如果一个人去度假,您可能会向另一个用户提供另一个编辑声明,因此现在去度假的人和第二个人都可以编辑投资组合。

可以看到授权问题简化为将业务中的某个对象映射到某个登录的人。

现在,出于历史目的,如果用户编辑业务数据中的记录,则存储该人的 ID 是有效的。这是身份 ID 或业务数据库中映射到身份用户的另一个 ID。

希望有用