【问题标题】:I want to create a super admin or system admin from backend or cli in ASP.NET Core我想在 ASP.NET Core 中从后端或 cli 创建超级管理员或系统管理员
【发布时间】:2023-03-15 00:06:01
【问题描述】:

我正在构建一个应用程序,其中注册页面仅供管理员用户使用,因此我可以将注册页面提供给管理员用户。但我需要创建一个可以创建这些用户的管理员用户。我不能通过任何 Api 来做到这一点。

问题

我正在使用基于 JWT 令牌的身份验证。在基于 JWT 令牌的身份验证中,它需要一定的程序来通过 C# 代码创建用户。 有什么方法可以在不调用 API 的情况下从反手创建用户?

        [HttpPost]  
        [Route("register")]  
        public async Task<IActionResult> Register(RegisterModel model)  
        {  
            var userExists = await userManager.FindByNameAsync(model.Username);  
            if (userExists != null)  
                return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User already exists!" });  
  
            ApplicationUser user = new ApplicationUser()  
            {  
                Email = model.Email,  
                SecurityStamp = Guid.NewGuid().ToString(),  
                UserName = model.Username  
            };  
            var result = await userManager.CreateAsync(user, model.Password);  
            if (!result.Succeeded)  
                return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User creation failed! Please check user details and try again." });  
  
            return Ok(new Response { Status = "Success", Message = "User created successfully!" });  
        }  
  
        [HttpPost]  
        [Route("register-admin")]  
        public async Task<IActionResult> RegisterAdmin(RegisterModel model)  
        {  
            var userExists = await userManager.FindByNameAsync(model.Username);  
            if (userExists != null)  
                return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User already exists!" });  
  
            ApplicationUser user = new ApplicationUser()  
            {  
                Email = model.Email,  
                SecurityStamp = Guid.NewGuid().ToString(),  
                UserName = model.Username  
            };  
            var result = await userManager.CreateAsync(user, model.Password);  
            if (!result.Succeeded)  
                return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User creation failed! Please check user details and try again." });  
  
            if (!await roleManager.RoleExistsAsync(UserRoles.Admin))  
                await roleManager.CreateAsync(new IdentityRole(UserRoles.Admin));  
            if (!await roleManager.RoleExistsAsync(UserRoles.User))  
                await roleManager.CreateAsync(new IdentityRole(UserRoles.User));  
  
            if (await roleManager.RoleExistsAsync(UserRoles.Admin))  
            {  
                await userManager.AddToRoleAsync(user, UserRoles.Admin);  
            }  
  
            return Ok(new Response { Status = "Success", Message = "User created successfully!" });  
        } 


        public void ConfigureServices(IServiceCollection services)
        {

            // Allow Cross for Centain Network

            services.AddCors(options =>
            {
                options.AddPolicy(name: MyAllowSpecificOrigins,
                                builder =>
                                {
                                    builder.WithOrigins(Configuration["JWT:ValidAudience"]);
                                });
            });


            services.AddControllers();

            // For Entity Framework  
            services.AddDbContext<DentalDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));  
  
            // For Identity  
            services.AddIdentity<ApplicationUser, IdentityRole>(options => 
            {
                options.Password.RequiredLength = 6;
                options.Password.RequireLowercase = false;
                options.Password.RequireUppercase = false;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireDigit = false;
            })  
            .AddEntityFrameworkStores<DentalDbContext>()  
            .AddDefaultTokenProviders();  


              
            // Adding Authentication  
            services.AddAuthentication(options =>  
            {  
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;  
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;  
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;  
            })  
  
            // Adding Jwt Bearer  
            .AddJwtBearer(options =>  
            {  
                options.SaveToken = true;  
                options.RequireHttpsMetadata = false;  
                options.TokenValidationParameters = new TokenValidationParameters()  
                {  
                    ValidateIssuer = true,  
                    ValidateAudience = true,  
                    ValidAudience = Configuration["JWT:ValidAudience"],  
                    ValidIssuer = Configuration["JWT:ValidIssuer"],  
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))  
                };  
            });  

        }


 








 

【问题讨论】:

  • OAuth 2 建立在 Open ID 之上。您所说的 Auth2 是什么意思?你使用微软身份吗?
  • 您是否在应用程序中使用 Asp.net Core Identity?如果您使用 Asp.net Core Identity 来管理用户和角色,由于密码是经过哈希处理的,当您将新用户插入数据库时​​,您必须对密码进行哈希处理。如果您启用了电子邮件确认,您仍然会在插入新用户时启用电子邮件确认。如果你没有使用asp.net核心身份,使用Oauth2登录后,你可以连接数据库并插入一个新的超级管理员用户,或者通过SSMS直接访问数据库并在用户表中插入一个新的项目。
  • @SlobodanT 它是基于 JWT 令牌的身份验证。虽然我正在尝试从 MSSQL 创建散列密码。我已经更新了我的帖子

标签: c# asp.net-core authentication oauth


【解决方案1】:

是的,如果您使用 Microsoft 标识。这是有出路的。 在 Program.cs 中

        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            try
            {
                using var scope = host.Services.CreateScope();
                var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
                var userManager = scope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();

                context.Database.EnsureCreated();

                if (!context.Users.Any())
                {
                    var superAdminUser= new IdentityUser
                    {
                        UserName = "SuperAdmin"
                    };

                    userManager.CreateAsync(superAdminUser, "SuperAdminPassword").GetAwaiter().GetResult();

                    //Roles contains user, user contains claims
                    var adminClaim = new Claim("Role", "SuperAdminUser");

                    userManager.AddClaimAsync(SuperAdminUser, adminClaim).GetAwaiter().GetResult();
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            host.Run();
        }

在启动时使用授权。

 services.AddAuthorization(options =>
 {
     options.AddPolicy("SuperAdmin", policy => policy.RequireClaim("Role", "SuperAdmin"));
 });

在控制器中为超级管理员角色添加授权

[Authorize(Policy = "SuperAdmin ")]
 public class SecretController : Controller
 {}

【讨论】:

  • userManager.AddClaimAsync(SuperAdminUser, adminClaim).GetAwaiter().GetResult();它是 SuperAdminUser 的 superAdminUser 的代表吗
  • superAdminUser 是超级管理员用户的实例。 userManager.AddClaimAsync(SuperAdminUser, adminClaim).GetAwaiter().GetResult(); 为超级管理员用户添加超级管理员角色。
猜你喜欢
  • 2021-11-12
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2010-10-10
相关资源
最近更新 更多