Я пытаюсь добавить аутентификацию и авторизацию в свой веб-API, используя систему аутентификации, предоставляемую .net8, но я борюсь с той частью, где я должен добавить пользователя в роль, например, когда пользователь подписывает - В моем приложении я хочу добавить этого пользователя в роль клиента. Как мне это сделать, не переписывая весь метод регистрации? если нет другого способа, как я могу получить доступ к этому методу, чтобы переопределить его?
это код, который у меня есть, я что-то упускаю?
builder.Services.AddIdentityApiEndpoints<IdentityUser>(opt =>
{
opt.Password.RequiredLength = 8;
opt.User.RequireUniqueEmail = true;
opt.Password.RequireNonAlphanumeric = false;
opt.SignIn.RequireConfirmedEmail = true;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();





Итак, по сути, нам нужно добавить роли в нашу базу данных в вашем Program.cs.
using (var scope = app.Services.CreateScope())
{
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
string[] roles = new[] { "superuser", "Client" };
foreach (var role in roles)
{
if (!await roleManager.RoleExistsAsync(role))
{
await roleManager.CreateAsync(new IdentityRole(role));
}
}
}
убедитесь, что вы добавили это сюда,
builder.Services.AddScoped<UserManager<IdentityUser>, CustomUserManager<IdentityUser>>();
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddScoped<UserManager<IdentityUser>, CustomUserManager<IdentityUser>>();
и если вы увидите в своей базе данных после запуска сервера,
и новое, нам нужно назначить роли по умолчанию, например, по умолчанию у нас есть доступ только к ссылке для создания пользователя, поэтому создайте имя класса С#, скажем, CustomUserManager и,
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
namespace ReactApp2.Server.Services
{
public class CustomUserManager<TUser> : UserManager<TUser> where TUser : class
{
public CustomUserManager(IUserStore<TUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<TUser> passwordHasher,
IEnumerable<IUserValidator<TUser>> userValidators, IEnumerable<IPasswordValidator<TUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<TUser>> logger)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
public override async Task<IdentityResult> CreateAsync(TUser user, string password)
{
var result = await base.CreateAsync(user, password);
if (result.Succeeded)
{
var defaultRole = "Client"; // Change to your default role name
await AddToRoleAsync(user, defaultRole);
}
return result;
}
}
}
Итак, теперь, если вы тестируете свой API, то, как только вы зарегистрируете кого-то, у кого есть идентификатор роли, который является ролью по умолчанию.
а вот таблица пользователей
возможно, как только логическое значение электронной почты соответствия станет истинным в базе данных, вы сможете отправить ответ json на сторону клиента что-то вроде {conformEmail: true} и на основе этого ответа перенаправить пользователя на вашу html-страницу
Раньше я делал это так для подтверждения электронной почты в API с помощью MailKit..
var email = new MimeMessage();
email.From.Add(MailboxAddress.Parse("your email"));
email.To.Add(MailboxAddress.Parse("email of user that you want to send conformation");
email.Subject = "Email verification";
Random module = new Random();
int code = module.Next(1000, 9999);
email.Body = new TextPart(TextFormat.Html)
{
Text = $"Hi we would like to comform your login your code is: {code}"
};
using var smtp = new SmtpClient();
smtp.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
smtp.Authenticate("your email", "your gmail app password");
smtp.Send(email);
smtp.Disconnect(true);
а позже вы можете создать API для переключения логического значения электронной почты на истинное или ложное, и на основе результата вы можете перенаправить пользователя.
Привет, ответ был очень полезным, но у меня есть еще один вопрос: есть ли способ переопределить конечную точку подтверждения электронной почты? Или какая-то другая конечная точка? Мне нужно перенаправить пользователя на другую страницу, когда электронное письмо будет подтверждено, или отобразить HTML-код, заранее спасибо