| | |
| | | <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> |
| | | 获取当前登录用户 |
| | |
| | | 刷新令牌 |
| | | </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> |
| | | 获取健康服务域名 |
| | |
| | | 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; |
| | |
| | | /// <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() |
| | | { |
| | |
| | | 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; |
| | | |
| | |
| | | { |
| | | 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) |
| | | { |
| | | string value = null; |
| | | if (builder.Headers.ContainsKey(name)) |
| | | { |
| | | builder = builder.WithHeader("X-Authorization", refreshToken); |
| | | //builder = builder.AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)); |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | |
| | | 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) |
| | | { |
| | |
| | | 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; |
| | | } |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | { |
| | | 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); |
| | | IResourceHttpProvider httpProvider = |
| | | |
| | | if (accessToken.IsNotNull()) |
| | | { |
| | | builder = builder.WithHeader("Authorization", accessToken); |
| | | } |
| | | if (refreshToken.IsNotNull()) |
| | | { |
| | | builder = builder.WithHeader("X-Authorization", refreshToken); |
| | | } |
| | | |
| | | IResourceHttpProvider httpProvider = |
| | | provider == EnumResourceHttpProvider.SystemUser |
| | | ? new SystemUserResourceHttpProvider() |
| | | : provider == EnumResourceHttpProvider.ElectronSignServer |
| | |
| | | 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>(); |
| | |
| | | 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) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | /// <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); |
| | |
| | | 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> |
| | |
| | | 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> |
| | |
| | | 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> |
| | |
| | | { |
| | | 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> |
| | |
| | | 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() |
| | | }; |
| | | } |
| | | } |
| | | } |
| | |
| | | <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> |
| | | 验证码命令处理器 |
New file |
| | |
| | | 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 |