gpt4 book ai didi

asp.net-core - .NET Core 2.1 MVC Identity Authorization - 不同部分的不同用户角色

转载 作者:行者123 更新时间:2023-12-05 06:32:52 25 4
gpt4 key购买 nike

目前,我正在一个项目管理网站上工作。系统中有一个SuperAdmin(角色),可以创建新项目。 super 管理员可以将用户分配给具有不同角色的这些项目,例如管理员或观察员。一个用户可以为不同的项目担任不同的角色,甚至可以不担任任何角色。
例如:

  1. 用户 A 是项目 A 的管理员
  2. 用户 A 是项目 B 的观察员(仅限读取权限)
  3. 用户 A 没有项目 C 的角色(无法访问该项目)
  4. 用户 B 是项目 B 的管理员
  5. 用户 B 是项目 C 的观察员(仅限读取权限)

Identity 似乎不支持这种行为。基于声明的授权似乎支持静态声明,但不支持动态声明(使用 id 访问项目)。我可以创建自己的 UserProjectRoles 类,将用户、项目和角色关联起来,并在授权处理程序(基于策略的授权)中使用它,但我想知道这是否是正确的解决方案。你会如何解决这个任务?

编辑:

我最终做了以下事情:我创建了一个新的 UserProjectClaims 表,它连接了用户和一个项目,并将角色类型作为枚举包含(我将角色/声明类型移动到它自己的表中,这只是为了为了测试)。

public class UserProjectClaim
{
public int ProjectId { get; set; }
public Project Project { get; set; }

public int UserId { get; set; }
public AppUser User { get; set; }

public UserProjectClaimEnum ClaimType { get; set; }
}

然后我在基于策略的授权教程中看到的 AuthorizationHandler 中使用了这个表:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, ProjectAdminRequirement requirement)
{
if (context.Resource is AuthorizationFilterContext authContext)
{
var projectId = Int32.Parse(authContext.HttpContext.Request.Query["projectId"]);
var userid = (await _userManager.GetUserAsync(context.User)).Id;
var claim = _dbContext.AppUsers.Include(i=>i.UserProjectClaims).Single(u=>u.Id==userid).UserProjectClaims.SingleOrDefault(p => p.ProjectId == projectId);

if (claim != null && claim.ClaimType == Data.Enums.UserProjectClaimEnum.ProjectAdmin)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}
}

它按预期工作。

最佳答案

使用个人用户帐户 (VS2017) 创建新的 Web 应用程序 (MVC) 后,您会发现 AspNetRoles、AspNetRoleClaims、AspNetUserRoles、AspNetUserClaims 等表作为 Entity Framework Core IdentityContext 的一部分。

AccountController 注入(inject)了 UserManager 但没有维护角色和声明的方法。未提供开箱即用的 View (页面)、 Controller 和模型来管理关系。

好消息是 UserManager 具有为用户添加声明和角色的各种功能。 AddClaimAsync、AddToRoleAsync、GetClaimsAsync、GetRolesAsync、GetUsersForClaimAsync、GetUsersInRoleAsync、RemoveClaimAsync、RemoveFromRoleAsync 以及将声明/角色作为 IEnumerable 处理的版本。

短期解决方案:向 AccountController 或 ManageController 添加方法,甚至创建 RolesController 来支持管理这些关系的页面,应该不是一项艰巨的任务。

长期解决方案:了解如何在您创建新的 MVC Identity 项目时添加模板以生成这些项目。然后通过在 GitHub 上公开它来炫耀 :) 或者写一篇文章,介绍您从处于您处境的其他人那里学到了什么。

后记:通过创建一个放在请求处理路径中的小中间件,您可以为当前用户加载角色/声明,请求处理的其余部分可以引用这些角色/声明。从项目到角色的连接表可能包含读取角色和写入角色,您可以将所需角色与用户拥有的角色/声明进行比较。

技术:Here是对自定义策略和授权的精彩解释。在您的情况下,该策略将测试用户是否具有与您的项目匹配的角色/声明。您上面的角色实际上是项目读取、项目写入。如果两者都不是,则无法访问。

关于asp.net-core - .NET Core 2.1 MVC Identity Authorization - 不同部分的不同用户角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51045524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com