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