#c# #.net #asp.net-identity
#c# #.net #asp.net-identity #asp.net-идентификатор
Вопрос:
Я добавил дополнительную таблицу к схеме идентификации по умолчанию под названием UserProfile
, которая содержит такие вещи, как информация об адресе. Когда новый пользователь регистрируется на сайте, я хотел бы добавить пользователей в IdentityUser
таблицу по умолчанию, добавить роли пользователей в UserRoles
таблицу по умолчанию и добавить дополнительную информацию о пользователе в мою новую UserProfile
таблицу. В настоящее время у меня это настроено, как показано в псевдокоде ниже. В insert User
и UserRoles
используются методы identitity по умолчанию, и я написал свои собственные методы для UserProfile
insert. В основном это происходит с тремя разными транзакциями вставки. Если происходит сбой в любой из трех транзакций вставки, затем выполняются отдельные Delete()
транзакции. Хотя у меня это работает, я предполагаю, что есть более элегантный способ сделать это?
CreateUser()
if CreateUser == success
{
AddUserRoles()
if AddRoles == success
{
AddUserProfile()
if AddUserProfile != success
{
DeleteUserRoles()
DeleteUser()
}
}
else
{
DeleteUser()
}
}
ФАКТИЧЕСКИЙ КОД
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
ReturnUrl = returnUrl;
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
var userResult = await _userManager.CreateAsync(user, Input.Password);
if (userResult.Succeeded)
{
var currentUser = await _userManager.FindByNameAsync(user.UserName);
var roleResult = await _userManager.AddToRolesAsync(currentUser, roles);
if (roleResult.Succeeded)
{
var profileSuccess = _userRepo.AddUserProfile(currentUser.Id);
if (profileSuccess)
{
return RedirectToPage("./RegisterConfirmation", new { email = user.Email });
}
else
{
await _userManager.DeleteAsync(user);
await _userManager.RemoveFromRolesAsync(user, roles);
}
}
else
{
await _userManager.DeleteAsync(user);
}
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
// If we got this far, something failed, redisplay form
return Page();
}
Комментарии:
1. Опубликуйте минимальный пример, чтобы указать, как вы используете идентификатор. Кроме того, используете ли вы экземпляр UserManager для создания пользователя?
2. Я добавил код