using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Primitives; using Zxd.Domain.Sso; namespace Zxd.Core.WebApi.Controllers { public class BaseSsoController : BaseController { private readonly IServiceProvider _serviceProvider; protected decimal Eid { get; set; } public BaseSsoController(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { if (context == null) return; using IServiceScope scope = _serviceProvider.CreateScope(); var configuration = scope.ServiceProvider.GetRequiredService(); var cacheDomain = scope.ServiceProvider.GetRequiredService(); var httpClient = scope.ServiceProvider.GetRequiredService(); var systemConfig = configuration.GetSection("SystemConfig").Get(); var appid = systemConfig.Appid; var values = new StringValues(); context?.HttpContext?.Request.Headers.TryGetValue("token", out values); var authToken = values.ToString(); if (!string.IsNullOrEmpty(authToken)) { var tokens = await cacheDomain.GetTokens(); if (tokens != null && tokens.Any() && tokens.Any(x => x.Token == authToken)) { var token = tokens.First(x => x.Token == authToken); if (token.ExpirationTime > DateTime.Now) { Eid = token.Eid; await next.Invoke(); return; } context.Result = new ObjectResult(ApiResult.Failed("token已过期或不合法!", 10001)); return; } var data = new { appId = appid, grantType = 1, token = authToken }; try { var response = await httpClient.PostAsync>($"{systemConfig.GetSsoTokenUrl()}", data); if (response == null || response.Ret != 0 || !response.Data.EmployeeId.HasValue) { context.Result = new ObjectResult(ApiResult.Failed("token已过期或不合法!", 10001)); return; } else { var eid = response.Data.EmployeeId.Value; Eid = eid; await cacheDomain.AddToken(new SsoUserTokenInfo { Eid = eid, ExpirationTime = DateTime.Now.AddDays(1), Token = authToken }); await next.Invoke(); } } catch (Exception ex) { var testresponse = await httpClient.PostAsync($"{systemConfig.GetSsoTokenUrl()}", data); Log.Error($"获取{systemConfig.GetSsoTokenUrl()}【{JsonHelper.ToJson(data)}】用户对象为{JsonHelper.ToJson(testresponse)}"); context.Result = new ObjectResult(ApiResult.Failed("token已过期或不合法!", 10001)); } } else { context.Result = new ObjectResult(ApiResult.Failed("token不能为空!", 10002)); } } } public class SsoZXDResponseDataDto { public string? AccessToken { get; set; } public string? RefreshToken { get; set; } public string? ExpireTime { get; set; } public int? EmployeeId { get; set; } public string? ExtensionNumber { get; set; } } }