【发布时间】: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