2015-07-26 20 views
14

Özel bir UserStore uyguladık, IUserStore<DatabaseLogin, int> ve IUserPasswordStore<DatabaseLogin, int> uygular.UserManager.FindAsync ile özel bir UserStore kullanma

Benim Girişi eylem yöntemi aşağıdaki gibidir: I Authentication yazdım özel kimlik doğrulama sınıfında

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(); 

, ben iyi, ayrıca FindByName yöntem bir uygulama kullanıcıyı döndürür çalışan bir Girişi yöntemi var. Ancak bu girişle SignIn'u denerseniz, kullanıcı kimliği doğrulanmamış olarak tanınır ve HttpContext.User.Identity her zaman boştur, bu yüzden UserManager.FindAsync'u denemek zorunda olduğumu hayal edin.

Bu yöntem, FindByNameAsync ve GetPasswordHashAsync numaralarını arar ve her zaman boş değer döndürür. Eğer ben veritabanı kullanıcılarını kullanıyorum görebileceğiniz gibi

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

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

, ben onlar için bir karma şifre almak nasıl emin değilim. Şimdilik, sadece doğru şifreyi Base65 saklıyorum!

Nerede yanlış gideceğimi bilmiyorum, herhangi bir rehberlik açıktır.

+0

Cevabınızı sorunuzdan ve uygun bir SO cevabına aktarır mısınız? Kendine cevap verebilirsin. :) –

cevap

5

Kısa cevap: hiçbir şey yanlış değil. Kullanıcı diğer eylem yöntemlerinde doğrulanır, ancak geçerli işlem yönteminde görünmüyor.

Takip ettiğim süreç budur, belki de uygulamanızın hatalarını ayıklamanıza yardımcı olur.

VerifyPasswordAsync başvuran CheckPasswordAsync ardından source code, FindAsync ilk çağrı FindByNameAsync okuduktan sonra. Yani iyi olmalı VerifyPasswordAsync geçersiz kılabilir.

Ben IPasswordHasher uygulayan özel bir password hasher oluşturulur ve bunun gibi benim UserManager arasında create yönteminde kayıtlı:

artık Yani
manager.PasswordHasher = new DbPasswordHasher(); 

, ben UserManager.FindAsync benim kullanıcıyı alabilirsiniz, ama bunun ortaya çıktı HttpContext.User.Identity hala null beri kullanıcı aldığınız farketmez! Benim hatam, kullanıcının mevcut eylemde kimliği doğrulanmadığını fark etmemesiydi, diğer eylem yöntemlerinde beklendiği gibi çalışıyordu!