You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

105 line
3.9 KiB

  1. using JT808.Gateway.SimpleQueueNotification.Configs;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.SignalR;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using Microsoft.Extensions.Logging;
  6. using Microsoft.Extensions.Options;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Net;
  11. using System.Security.Claims;
  12. using System.Security.Principal;
  13. using System.Text;
  14. using System.Text.Json;
  15. using System.Threading.Tasks;
  16. namespace JT808.Gateway.SimpleQueueNotification.Middlewares
  17. {
  18. public class JT808JwtMiddlewares
  19. {
  20. private readonly RequestDelegate next;
  21. private readonly ILogger logger;
  22. IOptionsMonitor<AuthOptions> authOptionsMonitor;
  23. public JT808JwtMiddlewares(RequestDelegate next,
  24. IOptionsMonitor<AuthOptions> authOptionsMonitor,
  25. ILoggerFactory loggerFactory)
  26. {
  27. this.next = next;
  28. this.authOptionsMonitor = authOptionsMonitor;
  29. logger = loggerFactory.CreateLogger<JT808JwtMiddlewares>();
  30. }
  31. public async Task Invoke(HttpContext context)
  32. {
  33. StringBuilder sb = new StringBuilder();
  34. sb.Append(getIp(context));
  35. sb.Append(",");
  36. sb.Append(getBrowser(context));
  37. sb.Append(",");
  38. if (context.Request.Query.TryGetValue("access_token", out var token))
  39. {
  40. if (token == "")
  41. {
  42. context.Response.StatusCode = (int)HttpStatusCode.OK;
  43. await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.Unauthorized, Msg = HttpStatusCode.Unauthorized.ToString() }));
  44. return;
  45. }
  46. else
  47. {
  48. sb.Append(token);
  49. }
  50. try
  51. {
  52. // 去认证服务器请求结果
  53. // 如果超级Token有值就不去jwt认证
  54. if (!string.IsNullOrEmpty(authOptionsMonitor.CurrentValue.SuperToken))
  55. {
  56. if(authOptionsMonitor.CurrentValue.SuperToken != token)
  57. {
  58. context.Response.StatusCode = (int)HttpStatusCode.OK;
  59. await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.Unauthorized, Msg = HttpStatusCode.Unauthorized.ToString() }));
  60. return;
  61. }
  62. }
  63. }
  64. catch (Exception ex)
  65. {
  66. logger.LogError(ex, ex.Message);
  67. context.Response.StatusCode = (int)HttpStatusCode.OK;
  68. await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.ExpectationFailed, Msg = HttpStatusCode.ExpectationFailed.ToString() }));
  69. return;
  70. }
  71. if(logger.IsEnabled(LogLevel.Debug))
  72. logger.LogDebug($"认证成功:{sb.ToString()}");
  73. await next(context);
  74. }
  75. else
  76. {
  77. context.Response.StatusCode = (int)HttpStatusCode.OK;
  78. await context.Response.WriteAsync(JsonSerializer.Serialize(new { Code = (int)HttpStatusCode.Unauthorized, Msg = HttpStatusCode.Unauthorized.ToString() }));
  79. }
  80. }
  81. private string getIp(HttpContext context)
  82. {
  83. Microsoft.Extensions.Primitives.StringValues ips;
  84. if (context.Request.Headers.TryGetValue("X-Real-IP", out ips))
  85. {
  86. return ips.FirstOrDefault() ?? "";
  87. }
  88. else
  89. {
  90. return context.Connection.RemoteIpAddress?.ToString() ?? "";
  91. }
  92. }
  93. private static string getBrowser(HttpContext context)
  94. {
  95. return context.Request.Headers["User-Agent"].FirstOrDefault();
  96. }
  97. }
  98. }