using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Web.Http;
using AIAHTML5.WebAPI.Models;
using AIAHTML5.WebAPI.ViewModels;
using JWT;
namespace AIAHTML5.WebAPI.Controllers
{
public class AccountController : ApiController
{
[AllowAnonymous]
[Route("api/signin")]
[HttpPost]
public HttpResponseMessage Login(LoginViewModel model)
{
var loginSuccess = false;
User userObj = new User();
userObj.Email = "amrita.vishnoi@ebix.com";
userObj.Id = 1;
HttpResponseMessage response = null;
if (ModelState.IsValid)
{
if (model.Email == userObj.Email && model.Password == "education")
{
loginSuccess = true;
}
else
{
loginSuccess = false;
}
if (loginSuccess)
{
object dbUser;
var token = CreateToken(userObj, out dbUser);
response = Request.CreateResponse(new { dbUser, token });
}
}
else
{
response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
return response;
}
//[AllowAnonymous]
//[Route("signup")]
//[HttpPost]
//public HttpResponseMessage Register(RegisterViewModel model)
//{
// HttpResponseMessage response;
// if (ModelState.IsValid)
// {
// var existingUser = db.Users.FirstOrDefault(u => u.Email == model.Email);
// if (existingUser != null)
// {
// return Request.CreateResponse(HttpStatusCode.BadRequest, "User already exist.");
// }
// //Create user and save to database
// //var user = CreateUser(model);
// object dbUser;
// //Create token
// var token = CreateToken(user, out dbUser);
// response = Request.CreateResponse(new { dbUser, token });
// }
// else
// {
// response = Request.CreateResponse(HttpStatusCode.BadRequest, new { success = false });
// }
// return response;
//}
///
/// Create a Jwt with user information
///
///
///
///
private static string CreateToken(User user, out object dbUser)
{
var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var expiry = Math.Round((DateTime.UtcNow.AddHours(2) - unixEpoch).TotalSeconds);
var issuedAt = Math.Round((DateTime.UtcNow - unixEpoch).TotalSeconds);
var notBefore = Math.Round((DateTime.UtcNow.AddMonths(6) - unixEpoch).TotalSeconds);
var payload = new Dictionary
{
{"email", user.Email},
{"userId", user.Id},
{"role", "Admin" },
{"sub", user.Id},
{"nbf", notBefore},
{"iat", issuedAt},
{"exp", expiry}
};
//var secret = ConfigurationManager.AppSettings.Get("jwtKey");
const string apikey = "secretKey";
var token = JsonWebToken.Encode(payload, apikey, JwtHashAlgorithm.HS256);
dbUser = new { user.Email, user.Id };
return token;
}
///
/// Create a new user and saves it to the database
///
///
///
//private User CreateUser(RegisterViewModel registerDetails)
//{
// var passwordSalt = CreateSalt();
// var user = new User
// {
// Salt = passwordSalt,
// Email = registerDetails.Email,
// PasswordHash = EncryptPassword(registerDetails.Password, passwordSalt)
// };
// var adminRole = db.Roles.FirstOrDefault(d => d.Name == "Admin");
// user.Roles.Add(new UserRole
// {
// User = user,
// Role = adminRole
// });
// db.Users.Add(user);
// db.SaveChanges();
// return user;
//}
///
/// Creates a random salt to be used for encrypting a password
///
///
public static string CreateSalt()
{
var data = new byte[0x10];
using (var cryptoServiceProvider = new RNGCryptoServiceProvider())
{
cryptoServiceProvider.GetBytes(data);
return Convert.ToBase64String(data);
}
}
///
/// Encrypts a password using the given salt
///
///
///
///
public static string EncryptPassword(string password, string salt)
{
using (var sha256 = SHA256.Create())
{
var saltedPassword = string.Format("{0}{1}", salt, password);
var saltedPasswordAsBytes = Encoding.UTF8.GetBytes(saltedPassword);
return Convert.ToBase64String(sha256.ComputeHash(saltedPasswordAsBytes));
}
}
//protected override void Dispose(bool disposing)
//{
// if (disposing)
// {
// db.Dispose();
// }
// base.Dispose(disposing);
//}
}
}