Files
secure-core/SecureCore/Controllers/AuthController.cs
T

108 lines
3.7 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System;
using System.Web;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using SecureCore.Services;
using SecureCore.Authentication;
namespace SecureCore.Controllers
{
[Route("[controller]")]
[ApiController]
public class AuthController : Controller
{
[HttpPost("login")]
[AcceptVerbs("POST")]
public IActionResult Login(LoginInfo info)
{
//Very the user has login data.
if (!UserDataService.UserHasLoginData(info.UserName)) return Unauthorized("User doesn't have login creds");
var (password, salt) = UserDataService.GetUserPasswordHash(info.UserName);
var agent = HttpContext.Request.Headers[Microsoft.Net.Http.Headers.HeaderNames.UserAgent];
var ip = PasswordManager.HashStringData(HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(), salt);
if (PasswordManager.PasswordIsValid(info.Password, salt, password))
{
if (HttpContext.Request.Cookies.ContainsKey("Session"))
{
if(UserDataService.IsSessionTokenValid(HttpContext.Request.Cookies["Session"]))//, info.UserName))
return Ok($"Session is live{Environment.NewLine}");
}
var sessionToken = SessionManager.CreateSessionToken();
UserDataService.SetUserSessionToken(UserDataService.GetUserId(info.UserName), sessionToken, DateTime.Now.AddDays(7), agent, ip);
HttpContext.Response.Cookies.Append("Session", sessionToken, GetCookieOptions());
return Ok($"Logged in success{Environment.NewLine}");
}
else
{
return Unauthorized();
}
}
[HttpPost("Register")]
[AcceptVerbs("POST")]
public IActionResult Register(LoginInfo info)
{
var (hash, salt) = PasswordManager.HashPassword(info.Password);
var sessionToken = SessionManager.CreateSessionToken();
var agent = HttpContext.Request.Headers[Microsoft.Net.Http.Headers.HeaderNames.UserAgent];
var ip = PasswordManager.HashStringData(HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(), salt);
try
{
var i = UserDataService.RegisterNewUser(info.UserName, info.Email, hash, salt, sessionToken, DateTime.Now.AddDays(7),agent, ip);
HttpContext.Response.Cookies.Append("Session", sessionToken, GetCookieOptions());
return Ok($"New User ID: {i}");
}
catch (Exception e)
{
return Unauthorized(e.Message);
}
}
[HttpPost("Logout")]
[AcceptVerbs("POST")]
public IActionResult Logout(LoginInfo info)
{
UserDataService.DestorySession(HttpContext.Request.Cookies["Session"]);
HttpContext.Response.Cookies.Delete("Session");
return Ok();
}
private CookieOptions GetCookieOptions()
{
return new CookieOptions
{
//Domain = "copyrightcrusader.org",
Expires = DateTime.Now.AddDays(7),
//HttpOnly = true,
//Secure = true,
Path = "/",
SameSite = SameSiteMode.Strict
};
}
}
public class LoginInfo
{
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
//TODO: Read more https://www.valentinog.com/blog/cookies/
// And this https://blog.webf.zone/ultimate-guide-to-http-cookies-2aa3e083dbae
}