Zxd.Core/code/Zxd.Core.WebApi/Controllers/BaseSsoController.cs

94 lines
3.8 KiB
C#

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<IConfiguration>();
var cacheDomain = scope.ServiceProvider.GetRequiredService<ICacheDomain>();
var httpClient = scope.ServiceProvider.GetRequiredService<IHttpClient>();
var systemConfig = configuration.GetSection("SystemConfig").Get<SystemConfig>();
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<RetResult<SsoZXDResponseDataDto>>($"{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<object>($"{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; }
}
}