Id的映射表及其角色存储在哪里?

时间:2019-10-24 04:41:46

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

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

  

[Authorize(Roles =“ Admin”)]

去哪里检查用户角色? 表示此事物将在哪里检查角色。

  

我正在使用Windows身份验证

1 个答案:

答案 0 :(得分:0)

您可以通过策略使用基于声明的授权。在应用程序中设置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自动创建表。