簡體   English   中英

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

[英]ASP.Net Identity .FindIdAsync not finding user?

我仍在努力嘗試使Identity 2正常運行的示例應用程序。 在以下文章中,我獲得了將角色信息添加到ViewModel來顯示用戶的幫助。 需要了解如何獲取/顯示用戶角色

現在,我試圖解決單擊用戶的“編輯”按鈕時遇到的問題。 當我嘗試使用.FindIdAsync方法查找控制器時,控制器會不斷為用戶顯示NULL。 但是,在調試模式下,我可以看到將正確的ID傳遞到Edit ActionResult中。

我在索引視圖中使用ViewModel的事實與此有關嗎? 我本以為,由於正確傳遞了ID,因此此時的ViewModel超出了圖片范圍。

我已經在網上搜索過,但是找不到任何可以幫助我解決問題的信息。

這是ActionResult,在調試中,我可以看到ID填充了正確的值。 因此,我不知道為什么找不到記錄。 沒有錯誤消息,它只是為用戶對象返回NULL,該對象在表中的每個用戶上顯示“ User Not Found”錯誤。

我希望有人可以幫助我指出一些可以幫助我弄清楚這一點的東西。

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; }
    }

我猜想,如果您僅使用現有的身份模型並實現如下所示的類,該類繼承IUserStore<User>, IUserLoginStore<User>類的接口IUserStore<User>, IUserLoginStore<User>您也許可以自行處理任何異步方法。

示例:請參見下面的代碼,此代碼使用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();
        });
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM