ASP.Net Identity .FindIdAsync找不到用户?

时间:2015-10-23 14:21:22

标签: c# asp.net asp.net-mvc asp.net-identity

我仍在努力尝试使用Identity 2工作的示例应用。在以下文章中,我获得了帮助向ViewModel添加角色信息以显示我的用户。 Need understanding on how to get/display User Role

现在我正在尝试解决当我点击用户的“编辑”按钮时遇到的问题。当我尝试使用.FindIdAsync方法找到它时,我的控制器一直为用户提供NULL。但是,在调试模式下,我可以看到正确的ID传递给Edit ActionResult。

我在索引视图中使用ViewModel的事实是否与它有关?我原本以为,由于正确传递了ID,因此ViewModel在那时就不在了。

我在网上搜索过但找不到任何可以帮我解决问题的内容。

这是ActionResult,在调试中我可以看到id正在填充正确的值。所以,我不知道为什么它没有找到记录。没有错误消息,它只是为显示" User Not Found"的用户对象返回NULL。我桌子上的每个用户都有错误。

我希望有人可以帮助指出我可以看到的东西,以帮助解决这个问题。

public async Task<ActionResult> Edit(string id)
{
    AppUser user = await UserManager.FindByIdAsync(id);
    if (user != null)
    {
        return View(user);
    }
    else
    {
        return View("Error", new string[] { "User Not Found" });
    }
}

public class AppUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

}

这是我在索引视图中使用的ViewModel,我认为这与此问题没有任何关系,但为了以防万一而显示它。

public class UserEditVM : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserRole { get; set; }
    public IEnumerable<AppRole> AllRoles { get; set; }
}

这是我的AppUserManager

public class AppUserManager : UserManager<AppUser>
{
    public AppUserManager(IUserStore<AppUser> store)
        : base(store) 
    {
    }

    public static AppUserManager Create(
            IdentityFactoryOptions<AppUserManager> options,
            IOwinContext context) 
    {

        AppIdentityDbContext db = context.Get<AppIdentityDbContext>();
        AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db));

        manager.PasswordValidator = new CustomPasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = false,
            RequireDigit = false,
            RequireLowercase = true,
            RequireUppercase = true
        };

        manager.UserValidator = new CustomUserValidator(manager)
        {
            AllowOnlyAlphanumericUserNames = true,
            RequireUniqueEmail = true
        };

        return manager;
    }
}

更新:这是我更新的ViewModel。删除了继承并从IdentityUser添加了我需要的属性。

public class UserEditVM 
    {
        public string Id { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string UserRole { get; set; }
        public IEnumerable<AppRole> AllRoles { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

我想,如果你只是使用现有的身份模型并实现一个像下面这样继承像IUserStore<User>, IUserLoginStore<User>这样的接口的类你可能能够自己处理任何异步方法。

示例:请参阅下面的代码,btw此代码使用dapper,因此您可以使用自己的ORM:

public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>, IUserRoleStore<User>
{
    private readonly string connectionString;

    public UserStore()
    {
        this.connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
    }      

    /// <summary>
    /// Returns User tables information, based on parameter type userId/Username will be equated in where condition
    /// </summary>
    /// <param name="userId">userId or Username can be passed</param>
    /// <returns></returns>
    public virtual Task<User> FindByIdAsync(string userId)
    {
        if (string.IsNullOrWhiteSpace(userId.ToString()))
            throw new ArgumentNullException("userId", string.Format("'{0}' is not a valid format.", new { userId }));

        return Task.Factory.StartNew(() =>
        {
            var parameters = new DynamicParameters();
            parameters.Add("@userId", userId);

            using (SqlConnection connection = new SqlConnection(connectionString))
                return connection.Query<User>("spUsers_GetUser", parameters, commandType: CommandType.StoredProcedure).SingleOrDefault();
        });
    }

}