diff --git a/Apimanager_backend/Apimanager_backend.csproj b/Apimanager_backend/Apimanager_backend.csproj
index 533afb7..4874a8a 100644
--- a/Apimanager_backend/Apimanager_backend.csproj
+++ b/Apimanager_backend/Apimanager_backend.csproj
@@ -8,11 +8,17 @@
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
diff --git a/Apimanager_backend/Config/ServiceCollectionExtensions.cs b/Apimanager_backend/Config/ServiceCollectionExtensions.cs
index 28a5528..295bb77 100644
--- a/Apimanager_backend/Config/ServiceCollectionExtensions.cs
+++ b/Apimanager_backend/Config/ServiceCollectionExtensions.cs
@@ -1,5 +1,10 @@
using Apimanager_backend.Services;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.IdentityModel.Tokens;
+using StackExchange.Redis;
+using System.ComponentModel;
using System.Runtime.CompilerServices;
+using System.Text;
namespace Apimanager_backend.Config
{
@@ -8,7 +13,36 @@ namespace Apimanager_backend.Config
public static IServiceCollection AddAllService(this IServiceCollection services,IConfiguration configuration)
{
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
+ services.AddJWTService(configuration);
services.AddScoped();
+ services.AddScoped();
+ services.AddSingleton();
+ services.AddSingleton();
+ services.AddSingleton();
+ return services;
+ }
+ public static IServiceCollection AddJWTService(this IServiceCollection services,IConfiguration configuration)
+ {
+ var jwtSettings = configuration.GetSection("JwtSettings");
+ var key = Encoding.ASCII.GetBytes(jwtSettings["Secret"]);
+ // JWT配置
+ services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+ .AddJwtBearer(options =>
+ {
+ options.TokenValidationParameters = new TokenValidationParameters
+ {
+ ValidateIssuer = true,
+ ValidateAudience = true,
+ ValidateLifetime = true,
+ ValidateIssuerSigningKey = true,
+ ValidIssuer = jwtSettings["Issuer"],
+ ValidAudience = jwtSettings["Audience"],
+ IssuerSigningKey = new SymmetricSecurityKey(key)
+ };
+ });
+
+ //redis配置
+ services.AddSingleton(ConnectionMultiplexer.Connect(configuration["Redis:ConnectionString"]));
return services;
}
}
diff --git a/Apimanager_backend/Controllers/AuthController.cs b/Apimanager_backend/Controllers/AuthController.cs
new file mode 100644
index 0000000..a6f8465
--- /dev/null
+++ b/Apimanager_backend/Controllers/AuthController.cs
@@ -0,0 +1,158 @@
+using Apimanager_backend.Dtos;
+using Apimanager_backend.Exceptions;
+using Apimanager_backend.Models;
+using Apimanager_backend.Services;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.VisualBasic;
+
+namespace Apimanager_backend.Controllers
+{
+ [Route("api/[controller]/[action]")]
+ [ApiController]
+ public class AuthController : ControllerBase
+ {
+ private readonly IAuthService authService;
+ private readonly ITokenService tokenService;
+ private readonly IRefreshTokenService refreshTokenService;
+ private readonly IUserService userService;
+ public AuthController(IAuthService authService, ITokenService tokenService, IRefreshTokenService refreshTokenService,IUserService userService)
+ {
+ this.authService = authService;
+ this.tokenService = tokenService;
+ this.refreshTokenService = refreshTokenService;
+ this.userService = userService;
+ }
+ ///
+ /// 用户登录控制器
+ ///
+ /// 登录信息
+ /// 通用返回信息格式
+ [HttpPost]
+ public async Task>> Login([FromBody] UserLoginDto dto)
+ {
+ UserInfoDto user = await authService.LoginAsync(dto.UserName, dto.Password);
+ //生成token
+ string token = tokenService.GenerateAccessToken(user.Id.ToString(), user.Roles);
+ //生成refreshtoken
+ string refreshToken = await refreshTokenService.CreateRefereshTokenAsync(user.Id.ToString());
+ var responseInfo = new ResponseBase(
+ code: 2000,
+ message: "Login successful",
+ data: new LoginResponseDto
+ {
+ UserInfo = user,
+ Token = token,
+ RefreshToken = refreshToken
+ }
+ );
+ return Ok(responseInfo);
+ }
+ ///
+ /// 令牌刷新
+ ///
+ /// 传入用户令牌
+ /// 返回新令牌
+ [HttpPost]
+ public async Task>> Refresh([FromBody]RefreshResponseDto dto)
+ {
+ var IsRefreshToken = await refreshTokenService.ValidateRefreshTokenAsync(dto.UserId.ToString(),dto.RefreshToken);
+ //刷新令牌无效
+ if (!IsRefreshToken)
+ {
+ var ret = new ResponseBase(
+ code: 2008,
+ message: "Refresh expires or is invalid",
+ data: null
+ );
+ return Unauthorized(ret);
+ }
+ //获取刷新令牌对应用户信息
+ var userInfo = await userService.GetUserAsync(dto.UserId);
+ //重新生成令牌
+ var token = tokenService.GenerateAccessToken(userInfo.Id.ToString(), userInfo.Roles);
+ //刷新刷新令牌有效期(小于三天才会刷新)
+ await refreshTokenService.UpdateRefreshTokenAsync(userInfo.Id.ToString());
+ var result = new ResponseBase(
+ code: 1000,
+ message: "Success",
+ data: new RefreshResponseDto
+ {
+ UserId = dto.UserId,
+ Token = token,
+ RefreshToken = dto.RefreshToken
+ }
+
+ );
+ return Ok(result);
+ }
+ ///
+ /// 用户注册
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task>> Register(RegisterRequestDto requestDto)
+ {
+ var isUsernameExist = await userService.IsUsernameExist(requestDto.Username);
+ if (isUsernameExist)
+ {
+ var errorRes = new ResponseBase(
+ code:2003,
+ message:"用户名已存在",
+ data:null
+ );
+ return StatusCode(409,errorRes);
+ }
+ try
+ {
+ var userInfo = await authService.RegisterAsync(requestDto);
+ var res = new ResponseBase(
+ code:1000,
+ message:"Success",
+ data:userInfo
+ );
+ return Ok(res);
+ }catch(BaseException e)
+ {
+ var res = new ResponseBase(
+ code:e.code,
+ message:e.message,
+ data: null
+ );
+ return StatusCode(500,res);
+ }
+
+ }
+ ///
+ /// 发送邮箱校验码
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task>> SendValidateCode([FromQuery]string email)
+ {
+ //检测邮箱是否被使用
+ var emailIsUse = await userService.IsEmailExist(email);
+ if (emailIsUse)
+ {
+ var errorRes = new ResponseBase