101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using OneForMe.Services;
|
|
|
|
namespace OneForMe.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("api/[controller]")]
|
|
public class AuthController : ControllerBase
|
|
{
|
|
private readonly ILdapService _ldapService;
|
|
private readonly SignInManager<IdentityUser> _signInManager;
|
|
private readonly UserManager<IdentityUser> _userManager;
|
|
private readonly ILogger<AuthController> _logger;
|
|
|
|
public AuthController(
|
|
ILdapService ldapService,
|
|
SignInManager<IdentityUser> signInManager,
|
|
UserManager<IdentityUser> userManager,
|
|
ILogger<AuthController> logger)
|
|
{
|
|
_ldapService = ldapService;
|
|
_signInManager = signInManager;
|
|
_userManager = userManager;
|
|
_logger = logger;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Login user with LDAP credentials
|
|
/// </summary>
|
|
[HttpPost("login")]
|
|
public async Task<IActionResult> Login([FromBody] LoginRequest request)
|
|
{
|
|
try
|
|
{
|
|
// Authenticate with LDAP
|
|
var isAuthenticated = await _ldapService.AuthenticateAsync(request.Username, request.Password);
|
|
|
|
if (!isAuthenticated)
|
|
{
|
|
_logger.LogWarning($"LDAP authentication failed for user {request.Username}");
|
|
return Unauthorized(new { message = "Invalid username or password" });
|
|
}
|
|
|
|
// Get user details from LDAP
|
|
var ldapUser = await _ldapService.GetUserAsync(request.Username);
|
|
if (ldapUser == null)
|
|
{
|
|
_logger.LogWarning($"Could not retrieve LDAP user details for {request.Username}");
|
|
return Unauthorized(new { message = "Could not retrieve user details" });
|
|
}
|
|
|
|
// Check if user exists in database, if not create them
|
|
var user = await _userManager.FindByNameAsync(request.Username);
|
|
if (user == null)
|
|
{
|
|
user = new IdentityUser
|
|
{
|
|
UserName = request.Username,
|
|
Email = ldapUser.Email,
|
|
EmailConfirmed = true
|
|
};
|
|
var result = await _userManager.CreateAsync(user);
|
|
if (!result.Succeeded)
|
|
{
|
|
_logger.LogError($"Failed to create user {request.Username} in database");
|
|
return BadRequest(new { message = "Failed to create user account" });
|
|
}
|
|
_logger.LogInformation($"Created new user {request.Username} in database");
|
|
}
|
|
|
|
// Sign in the user
|
|
await _signInManager.SignInAsync(user, false);
|
|
_logger.LogInformation($"User {request.Username} signed in successfully");
|
|
|
|
return Ok(new { message = "Login successful" });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError($"Login error: {ex.Message}");
|
|
return StatusCode(500, new { message = "An error occurred during login" });
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Logout user
|
|
/// </summary>
|
|
[HttpPost("logout")]
|
|
public async Task<IActionResult> Logout()
|
|
{
|
|
await _signInManager.SignOutAsync();
|
|
_logger.LogInformation("User logged out");
|
|
return Ok(new { message = "Logout successful" });
|
|
}
|
|
}
|
|
|
|
public class LoginRequest
|
|
{
|
|
public string Username { get; set; } = string.Empty;
|
|
public string Password { get; set; } = string.Empty;
|
|
} |