sunpengfei
2025-08-22 fb98eea517acdef61d9d9c1a1f537a728282fac9
feat:开发
1个文件已添加
8个文件已修改
316 ■■■■ 已修改文件
FlexJobApi.Core/FlexJobApi.Core.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/JwtUtils/JwtUtils.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpProvider/DefaultResourceHttpProvider.cs 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpProvider/ElectronSignServerResourceHttpProvider.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpProvider/SystemUserResourceHttpProvider.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Web.Entry/FlexJobApi.Web.Entry.sln 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -12451,6 +12451,15 @@
            <param name="logier"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.JwtUtils.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType,System.String)">
            <summary>
            获取当前登录用户
            </summary>
            <param name="user"></param>
            <param name="clientType"></param>
            <param name="session_key"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.JwtUtils.GetCurrentLogier">
            <summary>
            获取当前登录用户
@@ -12499,6 +12508,44 @@
            刷新令牌
            </summary>
        </member>
        <member name="M:FlexJobApi.Core.ResourceHttpUtils.SendHttpAsync(System.Object,System.String,System.String,FlexJobApi.Core.EnumResourceMethod,System.Nullable{FlexJobApi.Core.EnumResourceHttpProvider},System.String,System.String)">
            <summary>
            发送请求
            </summary>
            <param name="request">请求参数</param>
            <param name="serviceName">服务名称</param>
            <param name="route">路由</param>
            <param name="method">请求方式</param>
            <param name="provider">资源提供者</param>
            <param name="accessToken">访问令牌</param>
            <param name="refreshToken">刷新令牌</param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.ResourceHttpUtils.SendHttpAsync``2(``0,System.Nullable{FlexJobApi.Core.EnumResourceHttpProvider})">
            <summary>
            发送请求
            </summary>
            <typeparam name="TRequest"></typeparam>
            <typeparam name="TResponse"></typeparam>
            <param name="request"></param>
            <param name="provider"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.ResourceHttpUtils.GetHttpMethod(FlexJobApi.Core.EnumResourceMethod)">
            <summary>
            获取请求方式
            </summary>
            <param name="method"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.ResourceHttpUtils.GetUrl(System.String,System.String)">
            <summary>
            获取健康服务地址
            </summary>
            <param name="serviceName"></param>
            <param name="route"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.ResourceHttpUtils.GetHealthyServiceDomain(System.String)">
            <summary>
            获取健康服务域名
FlexJobApi.Core/Utils/JwtUtils/JwtUtils.cs
@@ -1,7 +1,10 @@
using Furion;
using Azure.Core;
using Furion;
using Furion.DatabaseAccessor;
using Furion.DataEncryption;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
@@ -53,6 +56,67 @@
        /// <summary>
        /// 获取当前登录用户
        /// </summary>
        /// <param name="user"></param>
        /// <param name="clientType"></param>
        /// <param name="session_key"></param>
        /// <returns></returns>
        public static LoginCommandCallback GetCurrentLogier(this User user, EnumClientType clientType, string session_key = null)
        {
            var logier = new CurrentLogier
            {
                Id = user.Id,
                Avatar = user.Avatar,
                Name = user.Name,
                UserName = user.UserName,
                PhoneNumber = user.PhoneNumber,
                Level = user.Level,
                Type = user.Type,
                ClientType = clientType,
                EnterpriseId = user.EnterpriseId,
            };
            GenerateToken(logier);
            return new LoginCommandCallback
            {
                Id = logier.Id,
                AccessToken = logier.AccessToken,
                RefreshToken = logier.RefreshToken,
                SessionKey = session_key,
                IsBindPhoneNumber = logier.PhoneNumber.IsNotNull()
            };
        }
        public static async Task<LoginCommandCallback> GetCurrentLogier(this string accessToken)
        {
            if (accessToken.IsNotNull())
            {
                var claims = JWTEncryption.ReadJwtToken(accessToken)?.Claims;
                if (claims != null)
                {
                    var claimIdentity = new ClaimsIdentity("AuthenticationTypes.Federation");
                    claimIdentity.AddClaims(claims);
                    var claimsPrincipal = new ClaimsPrincipal(claimIdentity);
                    var userId = claimsPrincipal.FindFirstValue("Id").ToGuid();
                    var clientType = claimsPrincipal.FindFirstValue("ClientType").ToEnum<EnumClientType>();
                    if (userId.HasValue && clientType.HasValue)
                    {
                        var user = await Db.GetRepository<User>().AsQueryable().AsNoTracking()
                            .Where(it => it.Id == userId)
                            .FirstOrDefaultAsync();
                        if (user != null)
                        {
                            var logier = user.GetCurrentLogier(clientType.Value);
                            return logier;
                        }
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// 获取当前登录用户
        /// </summary>
        /// <returns></returns>
        public static CurrentLogier GetCurrentLogier()
        {
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpProvider/DefaultResourceHttpProvider.cs
@@ -1,9 +1,13 @@
using Furion;
using Furion.DatabaseAccessor;
using Furion.DataEncryption;
using Furion.HttpRemote;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
@@ -16,21 +20,54 @@
    {
        public async Task<string> SendAsStringAsync(HttpRequestBuilder builder)
        {
            var token = App.HttpContext.Request.Headers["Authorization"].ToString();
            if (token.IsNotNull())
            var httpRemoteService = App.GetRequiredService<IHttpRemoteService>();
            builder = WithHeader(builder, "Authorization");
            builder = WithHeader(builder, "X-Authorization");
            var response = await httpRemoteService.SendAsStringAsync(builder);
            try
            {
                builder = builder.WithHeader("Authorization", token);
                //builder = builder.AddAuthentication(new AuthenticationHeaderValue("Authorization", token));
                var result = response.JsonTo(new
                {
                    Code = 0
                });
                if (result.Code == 401)
                {
                    var accessToken = GetHeaderValue(builder, "Authorization");
                    var logier = await accessToken.GetCurrentLogier();
                    if (logier != null)
                    {
                        builder = WithHeader(builder, "Authorization", logier.AccessToken);
                        builder = WithHeader(builder, "X-Authorization", logier.RefreshToken);
                        response = await httpRemoteService.SendAsStringAsync(builder);
                    }
                }
            }
            catch { }
            return response;
            }
            var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString();
            if (refreshToken.IsNotNull())
        public string GetHeaderValue(HttpRequestBuilder builder, string name)
            {
                builder = builder.WithHeader("X-Authorization", refreshToken);
                //builder = builder.AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken));
            string value = null;
            if (builder.Headers.ContainsKey(name))
            {
                value = builder.Headers[name].ToString();
            }
            else if (App.HttpContext.Request.Headers.ContainsKey(name))
            {
                value = App.HttpContext.Request.Headers[name].ToString();
            }
            return value;
            }
            return await App.GetRequiredService<IHttpRemoteService>().SendAsStringAsync(builder);
        private HttpRequestBuilder WithHeader(HttpRequestBuilder builder, string name, string value = null)
        {
            value ??= GetHeaderValue(builder, name);
            if (value.IsNotNull())
            {
                builder = builder.WithHeader(name, value);
            }
            return builder;
        }
    }
}
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpProvider/ElectronSignServerResourceHttpProvider.cs
@@ -49,8 +49,8 @@
                var result = httpRemoteService.PostAs<ElectronSignServerResult<IdentityModelTokenCacheItem>>($"{builder.RequestUri.Scheme}://{builder.RequestUri.Authority}/api/Account/GetTokenForWeb", builder =>
                    builder.SetJsonContent(new AccessRequestDto
                    {
                        UserName = "system",
                        UserPassword = "qwe321"
                        UserName = App.GetConfig<string>("ElectronSignServer:Account"),
                        UserPassword = App.GetConfig<string>("ElectronSignServer:Password")
                    }));
                if (result.Success)
                {
@@ -70,13 +70,14 @@
                var model = token.JsonTo<TokenDataModel>();
                if (model.AccessToken.IsNotNull())
                {
                    builder = builder.AddAuthentication(new AuthenticationHeaderValue("Authorization", model.AccessToken));
                    builder = builder.WithHeader("Authorization", model.AccessToken);
                }
                if (model.RefreshToken.IsNotNull())
                {
                    builder = builder.AddAuthentication(new AuthenticationHeaderValue("X-Authorization", model.RefreshToken));
                    builder = builder.WithHeader("X-Authorization", model.RefreshToken);
                }
            }
            return builder;
        }
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpProvider/SystemUserResourceHttpProvider.cs
@@ -65,12 +65,12 @@
                var model = token.JsonTo<TokenDataModel>();
                if (model.AccessToken.IsNotNull())
                {
                    builder = builder.AddAuthentication(new AuthenticationHeaderValue("Authorization", model.AccessToken));
                    builder = builder.WithHeader("Authorization", model.AccessToken);
                }
                if (model.RefreshToken.IsNotNull())
                {
                    builder = builder.AddAuthentication(new AuthenticationHeaderValue("X-Authorization", model.RefreshToken));
                    builder = builder.WithHeader("X-Authorization", model.RefreshToken);
                }
            }
            return builder;
FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs
@@ -7,6 +7,7 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Distributed;
using RabbitMQ.Client;
using RTools_NTS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
@@ -20,15 +21,44 @@
{
    public static class ResourceHttpUtils
    {
        public static async Task<string> SendHttpAsync(this object request, string serviceName, string route, EnumResourceMethod method, EnumResourceHttpProvider? provider = null)
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="request">请求参数</param>
        /// <param name="serviceName">服务名称</param>
        /// <param name="route">路由</param>
        /// <param name="method">请求方式</param>
        /// <param name="provider">资源提供者</param>
        /// <param name="accessToken">访问令牌</param>
        /// <param name="refreshToken">刷新令牌</param>
        /// <returns></returns>
        public static async Task<string> SendHttpAsync(
            this object request,
            string serviceName,
            string route,
            EnumResourceMethod method,
            EnumResourceHttpProvider? provider = null,
            string accessToken = null,
            string refreshToken = null)
        {
            serviceName = App.GetConfig<string>($"{serviceName}:ServiceName");
            var url = await GetUrl(serviceName, route);
            var builder = HttpRequestBuilder.Create(method.GetMethod(), url);
            var builder = HttpRequestBuilder.Create(method.GetHttpMethod(), url);
            if (method == EnumResourceMethod.Get)
                builder = builder.WithQueryParameters(request);
            else
                builder = builder.SetJsonContent(request);
            if (accessToken.IsNotNull())
            {
                builder = builder.WithHeader("Authorization", accessToken);
            }
            if (refreshToken.IsNotNull())
            {
                builder = builder.WithHeader("X-Authorization", refreshToken);
            }
            IResourceHttpProvider httpProvider = 
                provider == EnumResourceHttpProvider.SystemUser
                ? new SystemUserResourceHttpProvider()
@@ -41,7 +71,17 @@
            return response;
        }
        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(this TRequest request, EnumResourceHttpProvider? provider = null)
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <typeparam name="TRequest"></typeparam>
        /// <typeparam name="TResponse"></typeparam>
        /// <param name="request"></param>
        /// <param name="provider"></param>
        /// <returns></returns>
        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(
            this TRequest request,
            EnumResourceHttpProvider? provider = null)
        {
            var requestType = typeof(TRequest);
            var resourceAttribute = requestType.GetCustomAttribute<ResourceAttribute>();
@@ -75,7 +115,12 @@
            return response;
        }
        public static HttpMethod GetMethod(this EnumResourceMethod method)
        /// <summary>
        /// 获取请求方式
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        public static HttpMethod GetHttpMethod(this EnumResourceMethod method)
        {
            switch (method)
            {
@@ -92,6 +137,12 @@
            }
        }
        /// <summary>
        /// 获取健康服务地址
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="route"></param>
        /// <returns></returns>
        public static async Task<string> GetUrl(string serviceName, string route)
        {
            var domain = await GetHealthyServiceDomain(serviceName);
FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
@@ -54,7 +54,7 @@
                throw Oops.Oh(EnumUserErrorCodeType.u1000);
            if (user.Status == EnumUserStatus.Disabled)
                throw Oops.Oh(EnumUserErrorCodeType.u1001);
            return GetCurrentLogier(user, request.ClientType);
            return user.GetCurrentLogier(request.ClientType);
        }
        /// <summary>
@@ -78,7 +78,7 @@
                throw Oops.Oh(EnumUserErrorCodeType.u1000);
            if (user.Status == EnumUserStatus.Disabled)
                throw Oops.Oh(EnumUserErrorCodeType.u1001);
            return GetCurrentLogier(user, request.ClientType);
            return user.GetCurrentLogier(request.ClientType);
        }
        /// <summary>
@@ -113,7 +113,7 @@
                throw Oops.Oh(EnumUserErrorCodeType.u1000);
            if (user.Status == EnumUserStatus.Disabled)
                throw Oops.Oh(EnumUserErrorCodeType.u1001);
            return GetCurrentLogier(user, EnumClientType.Wxmp, snsJscode2session.session_key);
            return user.GetCurrentLogier(EnumClientType.Wxmp, snsJscode2session.session_key);
        }
        /// <summary>
@@ -218,14 +218,14 @@
                {
                    bindPhoneNumberUser.WxmpOpenId = user.WxmpOpenId;
                    await rep.DeleteAsync(user);
                    return GetCurrentLogier(bindPhoneNumberUser, EnumClientType.Wxmp);
                    return bindPhoneNumberUser.GetCurrentLogier(EnumClientType.Wxmp);
                }
                else if (bindPhoneNumberUser.WxmpOpenId != user.WxmpOpenId)
                {
                    throw Oops.Oh(EnumUserErrorCodeType.u1120);
                }
            }
            return GetCurrentLogier(user, EnumClientType.Wxmp);
            return user.GetCurrentLogier(EnumClientType.Wxmp);
        }
        /// <summary>
@@ -314,39 +314,6 @@
            model.CollectedUserCount = collects.Count(it => it.IsCollected);
            model.ContactedRecordCount = collects.Count(it => it.IsContacted);
            return model;
        }
        /// <summary>
        /// 获取当前登录用户
        /// </summary>
        /// <param name="user"></param>
        /// <param name="clientType"></param>
        /// <param name="session_key"></param>
        /// <returns></returns>
        private LoginCommandCallback GetCurrentLogier(User user, EnumClientType clientType, string? session_key = null)
        {
            var logier = new CurrentLogier
            {
                Id = user.Id,
                Avatar = user.Avatar,
                Name = user.Name,
                UserName = user.UserName,
                PhoneNumber = user.PhoneNumber,
                Level = user.Level,
                Type = user.Type,
                ClientType = clientType,
                EnterpriseId = user.EnterpriseId,
            };
            JwtUtils.GenerateToken(logier);
            return new LoginCommandCallback
            {
                Id = logier.Id,
                AccessToken = logier.AccessToken,
                RefreshToken = logier.RefreshToken,
                SessionKey = session_key,
                IsBindPhoneNumber = logier.PhoneNumber.IsNotNull()
            };
        }
    }
}
FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -79,15 +79,6 @@
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType,System.String)">
            <summary>
            获取当前登录用户
            </summary>
            <param name="user"></param>
            <param name="clientType"></param>
            <param name="session_key"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.UserServer.Application.VerifyCodeCommandHandler">
            <summary>
            验证码命令处理器
FlexJobApi.Web.Entry/FlexJobApi.Web.Entry.sln
New file
@@ -0,0 +1,24 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlexJobApi.Web.Entry", "FlexJobApi.Web.Entry.csproj", "{2590F706-6923-0B66-FA5B-FA0691CFE6C0}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {2590F706-6923-0B66-FA5B-FA0691CFE6C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {2590F706-6923-0B66-FA5B-FA0691CFE6C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {2590F706-6923-0B66-FA5B-FA0691CFE6C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {2590F706-6923-0B66-FA5B-FA0691CFE6C0}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {F871AC43-01DC-4184-B4B8-1B361367A910}
    EndGlobalSection
EndGlobal