【问题标题】:where is mapping table of Id and it's role stored?Id的映射表及其角色存储在哪里?
【发布时间】:2020-02-20 08:59:04
【问题描述】:

我正在使用 asp.net 核心授权。我有一些角色,例如 超级管理员,管理员,用户。每个用户将被分配其中一个。 SuperAdmin 可以更改任何用户的角色。所以基本上我想要动态角色系统。 那么在哪里映射用户角色数据和

[授权(角色=“管理员”)]

去哪里查看用户的角色? 表示这个东西检查角色的位置。

我正在使用 Windows 身份验证

【问题讨论】:

  • 听起来您想使用基于声明的授权而不是 Windows 授权。
  • 我无法找到角色用户的映射位置。我提到了 Windows 身份验证 bcs,我的数据库中没有维护用户名密码表。 @mr.coffee
  • 这些都是基本的 ASP.Net 身份功能。大量文档,例如 docs.microsoft.com/en-us/aspnet/core/security/authorization/….

标签: c# asp.net-core entity-framework-core authorization windows-authentication


【解决方案1】:

您可以通过政策使用基于声明的授权。在您的应用程序中设置 windows 身份验证后,您可以向 ClaimsPrincipal 添加自定义声明,检查用户的身份并确认当前用户拥有的权限/角色:

  1. 您可以向您的应用程序添加声明转换服务:

    class ClaimsTransformer : IClaimsTransformation
    {
        public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            var id = ((ClaimsIdentity)principal.Identity);
    
            var ci = new ClaimsIdentity(id.Claims, id.AuthenticationType, id.NameClaimType, id.RoleClaimType);
    
            //read database or flies or query AD to confirm user role by use ci.Name(username)
            if (....)
            {
                ci.AddClaim(new Claim("role", "Admin"));
            }
            else
            {
                ci.AddClaim(new Claim("role", "user"));
    
            }
    
    
            var cp = new ClaimsPrincipal(ci);
    
            return Task.FromResult(cp);
        }
    }
    
  2. 添加到 Startup.cs :

        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
    
  3. 制定您的政策:

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Admin", policy =>
                              policy.RequireClaim("role", "Admin"));
    
            options.AddPolicy("User", policy =>
                            policy.RequireClaim("role", "user"));
        });
    
  4. 通过要求此政策来限制对控制器或操作的访问:

        [Authorize(Policy = "Admin")]
        public IActionResult Contact()
        {
           .....
        }
    

您还可以将 AD 组用作角色。根据您的要求,您可以修改上述代码以适合您的场景。管理用户/角色可以使用本地数据库或 ASP.NET Core Identity 自动创建表。

【讨论】:

  • 但是在哪里可以看到哪个用户拥有哪个角色。这些数据存储在哪里?
  • 角色声明被添加到 cookie 中,由您决定存储在某个地方,例如数据库。
  • 正是我想要的。我想将角色存储在数据库中,以便我可以动态管理它。那么如何将它们存储在数据库中
  • 您可以在IClaimsTransformation 服务中从 AD 中读取角色/组并保存到数据库,或者在任何特定操作中执行角色管理,这取决于您。不知道你的问题是什么。
  • 在我的应用程序中,超级管理员将决定每个用户的角色。默认角色是“员工”。我想赋予超级管理员可以更改任何用户角色的能力。将来可以引入新角色。所以我想要映射 perticula 用户角色的数据库表。在该表上,我可以为任何用户的角色更改执行更新
猜你喜欢
  • 2023-04-04
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多