Files
StoreWeb/Store.API/Controllers/AuthController.cs
T

112 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Asp.Versioning;
using MAX.Framework.Dtos;
using MAX.Framework.Security;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
namespace Store.Api.Controllers
{
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
public class AuthController : ControllerBase
{
//private readonly IUserService _userService;
private readonly ITokenService _tokenService;
private readonly ICurrentUser _currentUser;
private readonly IOnlineUserStore _onlineUserStore;
private readonly ILogger<AuthController> _logger;
public AuthController(ITokenService tokenService, ICurrentUser currentUser, IOnlineUserStore onlineUserStore, ILogger<AuthController> logger)
{
//_userService = userService;
_tokenService = tokenService;
_currentUser = currentUser;
_onlineUserStore = onlineUserStore;
_logger = logger;
}
/// <summary>
/// 登录:校验用户名/密码,签发 JWT(单点登录:同用户的新登录会使旧令牌失效)
/// </summary>
[HttpPost]
[AllowAnonymous]
public async Task<ApiResultBase> Login([FromBody] LoginRequest request)
{
_logger.LogError("login errr");
_logger.LogInformation("login");
if (request is null || string.IsNullOrWhiteSpace(request.UserName) || string.IsNullOrWhiteSpace(request.Password))
{
return ApiResult.Fail("用户名或密码不能为空", 400);
}
//UserDto? user = await _userService.LoginAsync(request.UserName, request.Password);
//if (user is null)
//{
// return ApiResult.Error("用户名或密码错误", 401);
//}
var claims = new List<Claim>
{
new(JwtClaimTypes.UserName, request.UserName),
};
TokenResult token = _tokenService.CreateToken(claims);
return ApiResult.Ok(token);
}
/// <summary>
/// 退出登录:销毁当前用户的服务端在线会话,令牌立即失效
/// </summary>
[HttpPost]
[Authorize]
public ApiResult<object?> Logout()
{
if (_currentUser.UserName is string username)
{
_onlineUserStore.SignOut(username);
}
return ApiResult<object?>.Ok(null);
}
/// <summary>
/// 获取当前登录用户信息(需携带 Bearer Token)
/// </summary>
[HttpGet]
[Authorize]
public ApiResult<object?> Me()
{
return ApiResult<object?>.Ok(new
{
UserName = _currentUser.UserName,
NickName = _currentUser.NickName,
});
}
/// <summary>
/// 在线人员列表(需携带 Bearer Token)
/// </summary>
[HttpGet]
[Authorize]
public ApiResult<object?> OnlineUsers()
{
IReadOnlyList<OnlineUserInfo> users = _onlineUserStore.GetOnlineUsers();
return ApiResult<object?>.Ok(new
{
Count = users.Count,
Users = users,
});
}
}
public class LoginRequest
{
public string UserName { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
}
}