57 lines
No EOL
1.5 KiB
C#
57 lines
No EOL
1.5 KiB
C#
using System.Security.Claims;
|
|
using Microsoft.AspNetCore.Authentication;
|
|
using Mizuki.Database.Models;
|
|
|
|
namespace Mizuki.Services;
|
|
|
|
/// <summary>
|
|
/// The login service for Mizuki.
|
|
/// </summary>
|
|
public class LoginService(
|
|
IHttpContextAccessor httpContextAccessor,
|
|
UserService userService)
|
|
{
|
|
/// <summary>
|
|
/// Logs in as a given user.
|
|
/// </summary>
|
|
/// <param name="user">The user.</param>
|
|
public async Task LoginAsUser(
|
|
User user)
|
|
{
|
|
var claims = new List<Claim>
|
|
{
|
|
new(ClaimTypes.NameIdentifier, user.Id.ToString()),
|
|
new(ClaimTypes.Name, user.Username)
|
|
};
|
|
|
|
var claimsIdentity = new ClaimsIdentity(claims, "MizukiAuth");
|
|
await httpContextAccessor.HttpContext!
|
|
.SignInAsync(
|
|
"MizukiAuth",
|
|
new ClaimsPrincipal(claimsIdentity),
|
|
new AuthenticationProperties());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Logs out.
|
|
/// </summary>
|
|
public async Task Logout()
|
|
{
|
|
await httpContextAccessor.HttpContext!
|
|
.SignOutAsync("MizukiAuth");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the active user.
|
|
/// </summary>
|
|
/// <returns>The active user.</returns>
|
|
public async Task<User> GetActiveUser()
|
|
{
|
|
var username = httpContextAccessor.HttpContext!
|
|
.User
|
|
.FindFirst(ClaimTypes.Name)!
|
|
.ToString();
|
|
|
|
return await userService.GetUserForUsername(username);
|
|
}
|
|
} |