using JT808.Gateway.SimpleQueueNotification.Configs; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Security.Claims; using System.Security.Principal; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace JT808.Gateway.SimpleQueueNotification.Middlewares { public class JT808JwtMiddlewares { private readonly RequestDelegate next; private readonly ILogger logger; IOptionsMonitor authOptionsMonitor; public JT808JwtMiddlewares(RequestDelegate next, IOptionsMonitor authOptionsMonitor, ILoggerFactory loggerFactory) { this.next = next; this.authOptionsMonitor = authOptionsMonitor; logger = loggerFactory.CreateLogger(); } public async Task Invoke(HttpContext context) { StringBuilder sb = new StringBuilder(); sb.Append(getIp(context)); sb.Append(","); sb.Append(getBrowser(context)); sb.Append(","); if (context.Request.Query.TryGetValue("access_token", out var token)) { if (token == "") { context.Response.StatusCode = (int)HttpStatusCode.OK; await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.Unauthorized, Msg = HttpStatusCode.Unauthorized.ToString() })); return; } else { sb.Append(token); } try { // 去认证服务器请求结果 // 如果超级Token有值就不去jwt认证 if (!string.IsNullOrEmpty(authOptionsMonitor.CurrentValue.SuperToken)) { if(authOptionsMonitor.CurrentValue.SuperToken != token) { context.Response.StatusCode = (int)HttpStatusCode.OK; await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.Unauthorized, Msg = HttpStatusCode.Unauthorized.ToString() })); return; } } } catch (Exception ex) { logger.LogError(ex, ex.Message); context.Response.StatusCode = (int)HttpStatusCode.OK; await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.ExpectationFailed, Msg = HttpStatusCode.ExpectationFailed.ToString() })); return; } if(logger.IsEnabled(LogLevel.Debug)) logger.LogDebug($"认证成功:{sb.ToString()}"); await next(context); } else { context.Response.StatusCode = (int)HttpStatusCode.OK; await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.Unauthorized, Msg = HttpStatusCode.Unauthorized.ToString() })); } } private string getIp(HttpContext context) { Microsoft.Extensions.Primitives.StringValues ips; if (context.Request.Headers.TryGetValue("X-Real-IP", out ips)) { return ips.FirstOrDefault() ?? ""; } else { return context.Connection.RemoteIpAddress?.ToString() ?? ""; } } private static string getBrowser(HttpContext context) { return context.Request.Headers["User-Agent"].FirstOrDefault(); } } }