我有一个这样定义的自定义用户存储:
public class ExternalUserStore<T> : IUserStore<T>, IUserPasswordStore<T>, IUserRoleStore<T> where T : Models.ApplicationUser
其中一种方法是:
public Task<IList<string>> GetRolesAsync(T user)
该方法由自定义OAuthProvider GrantResourceOwnerCredentials方法中的ASP.NET身份调用,方法是:
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的对象,因此我需要通过id查找角色,然后将其添加到列表中。
但是,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。
我该怎么办?