У меня есть пользовательское хранилище, определенное следующим образом:
public class ExternalUserStore<T> : IUserStore<T>, IUserPasswordStore<T>, IUserRoleStore<T> where T : Models.ApplicationUser
Один из методов:
public Task<IList<string>> GetRolesAsync(T user)
Этот метод вызывается удостоверением ASP.NET в пользовательском OAuthProvider GrantResourceOwnerCredentialsметод, таким образом:
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "El nombre de usuario o la contraseña no son correctos.");
return;
}
var roles = await userManager.GetRolesAsync(user.Id);
Моя реализация метода GetRolesAsync такова:
public Task<IList<string>> GetRolesAsync(T user)
{
IList<string> roles = new List<string>();
foreach (var userRole in user.Roles)
{
// Here I need to create ApplicationRole objects
}
return Task.FromResult(roles);
}
Я думаю, что мне нужно перебрать user.Roles, а поскольку user.Roles - это списокобъект со свойствами UserId и RoleId, мне нужно найти роль по идентификатору, а затем добавить ее в список.
Однако user.Roles пуст и это очевидно, так как я не заполняю какие-либороль для пользователя.
Вопрос в том, как его заполнить.
Это метод FindByIdAsync пользователя, который заполняет информацию о пользователе:
public Task<T> FindByIdAsync(string userId)
{
using (var db = Helpers.DataRetrieval.GetConnector())
{
var usuarioStored = db.GetUsuarioPorId(userId);
if (usuarioStored == null)
return Task.FromResult((T)null);
var appUser = PopulateUserData(usuarioStored);
return Task.FromResult((T)appUser);
}
}
private Models.ApplicationUser PopulateUserData(MiddleTier.Models.IUsuario usuario)
{
var appUser = new Models.ApplicationUser()
{
Id = usuario.Id.ToString(),
UserName = usuario.Login,
Email = usuario.Email,
EmailConfirmed = true,
PasswordHash = usuario.PasswordHash,
SecurityStamp = usuario.PasswordSalt,
PhoneNumber = usuario.Telefono,
PhoneNumberConfirmed = !String.IsNullOrWhiteSpace(usuario.Telefono),
TwoFactorEnabled = false,
LockoutEnabled = usuario.Bloqueado
};
return appUser;
}
Как видите, я могу в appUserназначить свойство Roles, но я столкнулся с той же проблемой ..... Roles - это список IdentityUserRoles, который имеет 2 свойства: UserId и RoleId.
Что я могу сделать?