Ver código fonte

😁代码优化调整

zuohuaijun 2 anos atrás
pai
commit
c91c0f080a

+ 29 - 54
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -113,60 +113,35 @@ public class SysAuthService : IDynamicApiController, ITransient
         return await CreateToken(user);
     }
 
-	/// <summary>
-	/// 锁屏验证账号密码
-	/// </summary>
-	/// <param name="password"></param>
-	/// <remarks>用户名/密码:superadmin/123456</remarks>
-	/// <returns></returns>
-	[DisplayName("锁屏验证账号密码")]
-	public async Task<bool> Unlock([Required,FromQuery] string password)
-	{
-		// 判断密码错误次数(默认5次,缓存30分钟)
-		var keyErrorPasswordCount = $"{CacheConst.KeyErrorPasswordCount}{_userManager.Account}";
-		var errorPasswordCount = _sysCacheService.Get<int>(keyErrorPasswordCount);
-		if (errorPasswordCount >= 5)
-			throw Oops.Oh(ErrorCodeEnum.D1027);
-
-		// 账号是否存在
-		var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
-		_ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
-
-		// 账号是否被冻结
-		if (user.Status == StatusEnum.Disable)
-			throw Oops.Oh(ErrorCodeEnum.D1017);
-
-		// 租户是否被禁用
-		var tenant = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysTenant>>().GetFirstAsync(u => u.Id == user.TenantId);
-		if (tenant != null && tenant.Status == StatusEnum.Disable)
-			throw Oops.Oh(ErrorCodeEnum.Z1003);
-
-		// 国密SM2解密(前端密码传输SM2加密后的)
-		password = CryptogramUtil.SM2Decrypt(password);
-
-		// 密码是否正确
-		if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
-		{
-			if (!user.Password.Equals(MD5Encryption.Encrypt(password)))
-			{
-				_sysCacheService.Set(keyErrorPasswordCount, ++errorPasswordCount, TimeSpan.FromMinutes(30));
-				throw Oops.Oh(ErrorCodeEnum.D1000);
-			}
-		}
-		else
-		{
-			if (!CryptogramUtil.Decrypt(user.Password).Equals(password))
-			{
-				_sysCacheService.Set(keyErrorPasswordCount, ++errorPasswordCount, TimeSpan.FromMinutes(30));
-				throw Oops.Oh(ErrorCodeEnum.D1000);
-			}
-		}
-
-		// 登录成功则清空密码错误次数
-		_sysCacheService.Remove(keyErrorPasswordCount);
-
-		return true;
-	}
+    /// <summary>
+    /// 验证锁屏密码
+    /// </summary>
+    /// <param name="password"></param>
+    /// <returns></returns>
+    [DisplayName("验证锁屏密码")]
+    public async Task<bool> UnLockScreen([Required, FromQuery] string password)
+    {
+        // 账号是否存在
+        var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
+        _ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+
+        // 国密SM2解密(前端密码传输SM2加密后的)
+        password = CryptogramUtil.SM2Decrypt(password);
+
+        // 密码是否正确
+        if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
+        {
+            if (!user.Password.Equals(MD5Encryption.Encrypt(password)))
+                throw Oops.Oh(ErrorCodeEnum.D1000);
+        }
+        else
+        {
+            if (!CryptogramUtil.Decrypt(user.Password).Equals(password))
+                throw Oops.Oh(ErrorCodeEnum.D1000);
+        }
+
+        return true;
+    }
 
     /// <summary>
     /// 手机号登录

+ 15 - 12
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -155,17 +155,18 @@ public class Startup : AppStartup
             app.UseHsts();
         }
 
-        // 添加状态码拦截中间件
-        app.UseUnifyResultStatusCodes();
+        //// 启用HTTPS
+        //app.UseHttpsRedirection();
 
-        // 配置多语言
-        app.UseAppLocalization();
+        // 启用跨域
+        app.UseCorsAccessor();
 
-        // 图像处理
-        app.UseImageSharp();
+        // 启用鉴权授权
+        app.UseAuthentication();
+        app.UseAuthorization();
 
-        //// 启用HTTPS
-        //app.UseHttpsRedirection();
+        // 启用多语言,必须在路由注册之前
+        app.UseAppLocalization();
 
         // 特定文件类型(文件后缀)处理
         var contentTypeProvider = FS.GetFileExtensionContentTypeProvider();
@@ -175,17 +176,19 @@ public class Startup : AppStartup
             ContentTypeProvider = contentTypeProvider
         });
 
+        // 路由注册
         app.UseRouting();
 
-        app.UseCorsAccessor();
+        // 添加状态码拦截中间件
+        app.UseUnifyResultStatusCodes();
+
+        // 图像处理
+        app.UseImageSharp();
 
         // 限流组件(在跨域之后)
         app.UseIpRateLimiting();
         app.UseClientRateLimiting();
 
-        app.UseAuthentication();
-        app.UseAuthorization();
-
         // 任务调度看板
         app.UseScheduleUI();
 

+ 95 - 17
Web/src/api-services/apis/sys-auth-api.ts

@@ -11,6 +11,7 @@
  * https://github.com/swagger-api/swagger-codegen.git
  * Do not edit the class manually.
  */
+
 import globalAxios, { AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';
 import { Configuration } from '../configuration';
 // Some imports not used depending on template conditions
@@ -48,6 +49,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -84,6 +92,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -125,6 +140,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -170,6 +192,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -210,6 +239,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -247,6 +283,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             if (accessToken !== undefined) {
                 localVarQueryParameter['accessToken'] = accessToken;
@@ -269,18 +312,18 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             };
         },
         /**
-         * 用户名/密码:superadmin/123456
-         * @summary 锁屏验证账号密码
+         * 
+         * @summary 验证锁屏密码
          * @param {string} password 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthUnlockPost: async (password: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysAuthUnLockScreenPost: async (password: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'password' is not null or undefined
             if (password === null || password === undefined) {
-                throw new RequiredError('password','Required parameter password was null or undefined when calling apiSysAuthUnlockPost.');
+                throw new RequiredError('password','Required parameter password was null or undefined when calling apiSysAuthUnLockScreenPost.');
             }
-            const localVarPath = `/api/sysAuth/unlock`;
+            const localVarPath = `/api/sysAuth/unLockScreen`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
             let baseOptions;
@@ -292,6 +335,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             if (password !== undefined) {
                 localVarQueryParameter['password'] = password;
@@ -332,6 +382,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -368,6 +425,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -404,6 +468,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarQueryParameter = {} as any;
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -443,6 +514,13 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             const localVarFormParams = new FormData();
 
             // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
 
 
             if (userName !== undefined) { 
@@ -562,14 +640,14 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
             };
         },
         /**
-         * 用户名/密码:superadmin/123456
-         * @summary 锁屏验证账号密码
+         * 
+         * @summary 验证锁屏密码
          * @param {string} password 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysAuthUnlockPost(password: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultBoolean>>> {
-            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthUnlockPost(password, options);
+        async apiSysAuthUnLockScreenPost(password: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultBoolean>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthUnLockScreenPost(password, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -696,14 +774,14 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
             return SysAuthApiFp(configuration).apiSysAuthRefreshTokenGet(accessToken, options).then((request) => request(axios, basePath));
         },
         /**
-         * 用户名/密码:superadmin/123456
-         * @summary 锁屏验证账号密码
+         * 
+         * @summary 验证锁屏密码
          * @param {string} password 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysAuthUnlockPost(password: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultBoolean>> {
-            return SysAuthApiFp(configuration).apiSysAuthUnlockPost(password, options).then((request) => request(axios, basePath));
+        async apiSysAuthUnLockScreenPost(password: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultBoolean>> {
+            return SysAuthApiFp(configuration).apiSysAuthUnLockScreenPost(password, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -817,15 +895,15 @@ export class SysAuthApi extends BaseAPI {
         return SysAuthApiFp(this.configuration).apiSysAuthRefreshTokenGet(accessToken, options).then((request) => request(this.axios, this.basePath));
     }
     /**
-     * 用户名/密码:superadmin/123456
-     * @summary 锁屏验证账号密码
+     * 
+     * @summary 验证锁屏密码
      * @param {string} password 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysAuthApi
      */
-    public async apiSysAuthUnlockPost(password: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultBoolean>> {
-        return SysAuthApiFp(this.configuration).apiSysAuthUnlockPost(password, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysAuthUnLockScreenPost(password: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultBoolean>> {
+        return SysAuthApiFp(this.configuration).apiSysAuthUnLockScreenPost(password, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 2 - 2
Web/src/layout/lockScreen/index.vue

@@ -191,7 +191,7 @@ const onLockScreenSubmit = async () => {
 			// const keys = SM2.generateKeyPair();
 			const publicKey = `0484C7466D950E120E5ECE5DD85D0C90EAA85081A3A2BD7C57AE6DC822EFCCBD66620C67B0103FC8DD280E36C3B282977B722AAEC3C56518EDCEBAFB72C5A05312`;
 			const password = sm2.doEncrypt(state.lockScreenPassword, publicKey, 1);
-			const [err, res] = await feature(getAPI(SysAuthApi).apiSysAuthUnlockPost(password));
+			const [err, res] = await feature(getAPI(SysAuthApi).apiSysAuthUnLockScreenPost(password));
 			if (err) {
 				console.log(err);
 				state.message = err.message;
@@ -211,7 +211,7 @@ const onLockScreenSubmit = async () => {
 		}
 	}
 };
-//隐藏消息
+// 隐藏消息
 const hideMessage = () => {
 	state.showMessage = false;
 	nextTick(() => {