94 lines
3.8 KiB
C#
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; }
|
|
}
|
|
} |