簡體   English   中英

結合使用UserManager.FindAsync和自定義UserStore

[英]Using UserManager.FindAsync with a custom UserStore

我已經實現了自定義UserStore ,它實現了IUserStore<DatabaseLogin, int>IUserPasswordStore<DatabaseLogin, int>

我的登錄操作方法如下:

if (ModelState.IsValid)
{
    if (Authentication.Login(user.Username, user.Password))
    {
        DatabaseLogin x = await UserManager.FindAsync(user.Username, user.Password);
        DatabaseLogin Login = Authentication.FindByName(user.Username);
        if (Login != null)
        {
            ClaimsIdentity ident = await UserManager.CreateIdentityAsync(Login,
                DefaultAuthenticationTypes.ApplicationCookie);
            AuthManager.SignOut();
            AuthManager.SignIn(new AuthenticationProperties
            {
                IsPersistent = false
            }, ident);
            return RedirectToAction("Index", "Home");
        }
    }
    else
    {
        ModelState.AddModelError("", "Invalid Login");
    }
}
return View();

在我編寫的自定義身份驗證類Authentication ,我有一個很好的Login方法, FindByName方法也返回了一個應用程序用戶。 但是,如果我嘗試SignIn與登錄時,用戶不會被識別為認證和HttpContext.User.Identity總是空的,所以我想象我必須嘗試UserManager.FindAsync

此方法調用FindByNameAsyncGetPasswordHashAsync ,並且始終返回null。

public Task<DatabaseLogin> FindByNameAsync(string userName)
{
    if (string.IsNullOrEmpty(userName))
        throw new ArgumentNullException("userName");
    return Task.FromResult<DatabaseLogin>(Authentication.FindByName(userName));
}

public Task<string> GetPasswordHashAsync(DatabaseLogin user)
{
    if (user == null)
        throw new ArgumentNullException("user");
    return Task.FromResult<string>(user.Password);
}

Authentication.FindByName

public static DatabaseLogin FindByName(string name)
{
    string GetUserQuery = string.Format(
        "USE db;SELECT principal_id AS id, name as userName, create_date AS CreateDate, modify_date AS modifyDate FROM sys.database_principals WHERE type='S' AND authentication_type = 1 AND name = '{0}'"
        , name);
    DatabaseLogin user;
    using (var db = new EFDbContext())
    {
        user = db.Database.SqlQuery<DatabaseLogin>(GetUserQuery).FirstOrDefault();
    }
    user.Password = Convert.ToBase64String(Encoding.ASCII.GetBytes("pass"));
    return user;
}

如您所見,我正在使用數據庫用戶,但不確定如何為他們檢索哈希密碼。 現在,我只是存儲正確密碼的Base65!

我不知道我要去哪里錯,歡迎任何指導。

簡短的答案:沒錯。 通過其他操作方法對用戶進行身份驗證,但顯然無法通過當前操作方法進行身份驗證。

這是我遵循的過程,可能會幫助您調試應用程序。

讀取源代碼后FindAsync首先調用FindByNameAsync ,然后調用CheckPasswordAsync ,后者引用VerifyPasswordAsync 因此,如果我可以覆蓋VerifyPasswordAsync那就應該VerifyPasswordAsync

我創建了一個實現IPasswordHasher的自定義password hasher IPasswordHasher ,並將其注冊到UserManagercreate方法中,如下所示:

manager.PasswordHasher = new DbPasswordHasher();

因此,到目前為止,我可以從UserManager.FindAsync獲取用戶,但是事實證明,由於HttpContext.User.Identity仍然為null,您在哪里獲取用戶都沒有關系! 我的錯誤是我沒有注意到用戶在當前操作中未通過身份驗證,在其他操作方法中未按預期工作!

暫無
暫無

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

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