/// <summary> /// Erstellt einen neuen Benutzer in der Datenbank. Dafür wird ein Salt generiert und der /// Hash des Passwortes berechnet. /// </summary> /// <param name="credentials"></param> /// <returns></returns> public async Task <User> CreateUser(UserDto credentials, PureFitDbContext con) { string salt = GenerateRandom(); User newUser = new User { U_Name = credentials.Username, U_Salt = salt, U_Hash = CalculateHash(credentials.Password, salt), U_Kunde_Nr = null, U_Role = "Admin", //Alle die sich registrieren sind Kunden und keine Admins zum bearbeiten U_ID = null //ID muss zuerst auf null gesetzt werden, weil db sonst nicht erkennt, dass AutoIncrement gesetzt werden soll! }; con.Entry(newUser).State = Microsoft.EntityFrameworkCore.EntityState.Added; await con.SaveChangesAsync(); return(newUser); }
/// <summary> /// Erstellt einen neuen Benutzer in der Datenbank. Dafür wird ein Salt generiert und der /// Hash des Passwortes berechnet. /// </summary> /// <param name="credentials"></param> /// <returns></returns> public async Task <User> CreateUserKunde(UserKundenDto credentials, PureFitDbContext con) { string salt = GenerateRandom(); // Den neuen Userdatensatz erstellen Kunde newKunde = new Kunde { K_Vorname = credentials.Vorname, K_Zuname = credentials.Zuname, K_Geschlecht = credentials.Geschlecht, K_GebDatum = Encoding.ASCII.GetBytes(credentials.GebDatum), K_Gewicht = Encoding.ASCII.GetBytes(credentials.Gewicht), K_Groesse = Encoding.ASCII.GetBytes(credentials.Groesse), K_TelefonNr = credentials.TelefonNr, K_Email = credentials.Email, K_Trainingslevel = con.Trainingslevel.Where(w => w.tr_levelname == credentials.Trainingslevel).Select(s => s.tr_levelNr).FirstOrDefault(), K_Nr = null }; con.Entry(newKunde).State = Microsoft.EntityFrameworkCore.EntityState.Added; await con.SaveChangesAsync(); User newUser = new User { U_Name = credentials.Username, U_Salt = salt, U_Hash = CalculateHash(credentials.Password, salt), U_Kunde_Nr = newKunde.K_Nr, U_Role = "Kunde", //Alle die sich registrieren sind Kunden und keine Admins zum bearbeiten U_ID = null //ID muss zuerst auf null gesetzt werden, weil db sonst nicht erkennt, dass AutoIncrement gesetzt werden soll! }; con.Entry(newUser).State = Microsoft.EntityFrameworkCore.EntityState.Added; await con.SaveChangesAsync(); return(newUser); }
/// <summary> /// Konstruktor. Setzt den DB Context. /// </summary> /// <param name="context">Der über services.AddDbContext() gesetzte Context.</param> public FitnessController(PureFitDbContext context) { this._context = context; }
public UserController(PureFitDbContext context, AuthService authService) { _authService = authService; this._context = context; }
public AdminController(PureFitDbContext context, AuthService authService) { this._authService = authService; this._context = context; }
public KundenController(PureFitDbContext context) { this._context = context; }
/// <summary> /// Prüft, ob der übergebene User existiert und gibt seine Rolle zurück. /// TODO: Anpassen der Logik an die eigenen Erfordernisse. /// </summary> /// <param name="credentials">Benutzername und Passwort, die geprüft werden.</param> /// <returns> /// Rolle, wenn der Benutzer authentifiziert werden konnte. /// Null, wenn der Benutzer nicht authentifiziert werden konnte. /// </returns> protected virtual async Task <string> CheckUserAndGetRole(UserDto credentials, PureFitDbContext con) { // Abfrage, ob es den User überhaupt gibt if (!con.User.Any(u => u.U_Name == credentials.Username)) { return(null); } //Lese das salt aus der DB vom User string dbsalt = con.User.Where(u => u.U_Name == credentials.Username).Select(w => w.U_Salt).FirstOrDefault(); //Lese den hash aus der DB vom User string dbHash = con.User.Where(u => u.U_Name == credentials.Username).Select(w => w.U_Hash).FirstOrDefault(); // TODO: Um das Passwort zu prüfen, berechnen wir den Hash mit dem Salt in der DB. Stimmt // das Ergebnis mit dem gespeichertem Ergebnis überein, ist das Passwort richtig. string hash = CalculateHash(credentials.Password, dbsalt); if (hash != dbHash) { return(null); } // die Rolle zuweisen return(con.User.Where(u => u.U_Name == credentials.Username).Select(w => w.U_Role).FirstOrDefault()); }
/// <summary> /// Generiert den JSON Web Token für den übergebenen User. /// </summary> /// <param name="credentials">Userdaten, die in den Token codiert werden sollen.</param> /// <returns> /// JSON Web Token, wenn der User Authentifiziert werden konnte. /// Null wenn der Benutzer nicht gefunden wurde. /// </returns> public async Task <string> GenerateToken(UserDto credentials, TimeSpan lifetime, PureFitDbContext con) { if (credentials is null) { throw new ArgumentNullException(nameof(credentials)); } string role = await CheckUserAndGetRole(credentials, con); if (role == null) { return(null); } JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor { // Payload für den JWT. Subject = new ClaimsIdentity(new Claim[] { // Benutzername als Typ ClaimTypes.Name. new Claim(ClaimTypes.Name, credentials.Username.ToString()), // Rolle des Benutzer als ClaimTypes.DefaultRoleClaimType new Claim(ClaimsIdentity.DefaultRoleClaimType, role) }), Expires = DateTime.UtcNow + lifetime, SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(_secret), SecurityAlgorithms.HmacSha256Signature) }; SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); return(tokenHandler.WriteToken(token)); }