ich tue benutzerdefinierte Authentifizierung in mvc asp.net identity and owin
Framework aber leider nicht vom Benutzer immer mit dem richtigen Anmeldeinformationen mit folgenden Methode:nicht mit richtigen Anmeldeinformationen mit asp.net Identität bekommen Benutzer und owin
var user = UserManager.Find(email, HashedNewPassword);
Ich habe meine E-Mail gespeichert und Passwort wie unten in meiner Datenbank-Tabelle:
Id EmailAdress Password
1 [email protected] 123456
Gerade jetzt ich so tue, aber später werde ich dieses Passwort-Hash und speichern sie in der Tabelle. Dies ist nur zum Testen von Microsoft owin Framework.
Aber ich bin nicht mit diesen Anmeldeinformationen erhalte Benutzer:
Emaild Id:[email protected]
Password:123456.
Dies ist mein Code:
Controller:
[Authorize]
public class AuthenticationController : Controller
{
public AuthenticationController()
: this(new UserManager<UserModel>(new UserStore(new MyEntities())))
{
}
public AuthenticationController(UserManager<UserModel> userManager)
{
UserManager = userManager;
}
public UserManager<UserModel> UserManager { get; private set; }
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(string email, string password, string returnUrl)
{
if (ModelState.IsValid)
{
var user = UserManager.Find(email, password); //getting null here
}
}
}
UserModel:
public class UserModel : IUser
{
public string Id { get; private set; }
public string UserName { get { return Email; } set { Email = value; } }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public UserModel(string email, string firstName, string lastName)
{
Email = email;
FirstName = firstName;
LastName = lastName;
}
public UserModel(Users dbUser)
{
if (dbUser == null)
return;
Id = dbUser.Id.ToString();
Email = dbUser.EmailAddress;
FirstName = dbUser.FirstName;
LastName = dbUser.LastName;
}
}
public class UserStore : IUserStore<UserModel>, IUserPasswordStore<UserModel>
{
public Task<UserModel> FindByNameAsync(string userName)
{
return Task.Factory.StartNew(() =>
{
HttpContext.Current = _httpContext ?? HttpContext.Current;
var dbUser = GetDbUser(userName);
if (dbUser == null)
return null;
return new UserModel(dbUser);
});
}
private Users GetDbUser(string userName)
{
using (var db = new MyEntities())
{
return db.Users.FirstOrDefault(u => u.EmailAddress.Equals(userName, StringComparison.OrdinalIgnoreCase));
}
}
public Task<string> GetPasswordHashAsync(UserModel user)
{
return Task.Factory.StartNew(() =>
{
HttpContext.Current = _httpContext ?? HttpContext.Current;
var userObj = GetDbUser(user);
int len = userObj.Password.Length % 4;
//solved this error with below code :Invalid length for a Base-64 char array
if (len > 0) userObj.Password = userObj.Password.PadRight(userObj.Password.Length + (4 - len), '=');
return userObj.Password; //sometimes progam gets stuck here on debugging
});
}
private Users GetDbUser(UserModel user)
{
if (user.Id == null)
return null;
return GetDbUser(Convert.ToInt32(user.Id));
}
private Users GetDbUser(int userId)
{
using (var db = new MyEntities())
{
return db.Users.FirstOrDefault(u => u.Id == userId);
}
}
}
Was ist das Problem?
Aber im Grunde wir gewohnt Ab sofort geben wir jede Art von Registrierung an. Wir werden Benutzer direkt aus der Datenbank erstellen, damit nur einige Benutzer sich schnell bei System anmelden können. Also, wie mache ich das? –
Auch wenn Sie Benutzern nicht erlauben, sich direkt zu registrieren, sollten Sie immer noch eine Art Administrator zur Verfügung stellen, von wo aus Sie neue Benutzer erstellen können, in denen Sie dann das festgelegte Passwort hashen können. Da Identity ziemlich genau die Verantwortung für das Hashing übernehmen muss, damit es später bei der Anmeldung des Benutzers zutrifft, müssen Sie es über die API Identity bereitstellen, anstatt nur Datensätze manuell zur Datenbank hinzuzufügen. –
Aber wenn Sie diese Methode betrachten GetDbUser (Benutzer) dieses GetPasswordHashAsync ich bekomme Benutzer aber wenn ich debuggen und Kontrolle kommt in dieser Zeile zurück BenutzerObj.Password; dann Programm stecken bleiben.Warum passiert das ?? –