使用 ASP.net 身份模型声明来映射数据库中记录之间的关系是否不合适?
Is it inappropriate to use ASP.net Identity Model Claims to map relationships between records in a database?
我知道 ASP.net 身份模型通常用于验证用户是否被允许访问特定资源/端点。我还没有找到任何人做我所做的事的例子,我决定我可能正在走上一条痛苦和背叛的道路。
我有一个示例,说明我正在尝试使用基于索赔的记录查询。
- 一个用户请求他所有的客户
- 返回我的当前用户是其经理的 clientIds 列表
- 我们检索所有这些客户,并获取他们与投资组合相关的声明
- 然后我们去检索 x 客户拥有的所有投资组合
- 建立响应并将其发送。
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。
希望有用
我知道 ASP.net 身份模型通常用于验证用户是否被允许访问特定资源/端点。我还没有找到任何人做我所做的事的例子,我决定我可能正在走上一条痛苦和背叛的道路。
我有一个示例,说明我正在尝试使用基于索赔的记录查询。
- 一个用户请求他所有的客户
- 返回我的当前用户是其经理的 clientIds 列表
- 我们检索所有这些客户,并获取他们与投资组合相关的声明
- 然后我们去检索 x 客户拥有的所有投资组合
- 建立响应并将其发送。
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。
希望有用