LoginRequiredMiddleware.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Common.Extension;
  2. namespace Kitty_Fall.Website.Helpers;
  3. public class LoginRequiredMiddleware
  4. {
  5. private readonly RequestDelegate _next;
  6. public LoginRequiredMiddleware(RequestDelegate next)
  7. {
  8. _next = next;
  9. }
  10. public async Task InvokeAsync(HttpContext context)
  11. {
  12. if (ShouldSkip(context))
  13. {
  14. await _next(context);
  15. return;
  16. }
  17. var msisdn = context.Session.GetComplexData<string>("msisdn");
  18. if (!string.IsNullOrWhiteSpace(msisdn))
  19. {
  20. await _next(context);
  21. return;
  22. }
  23. context.Response.Headers.CacheControl = "no-store";
  24. if (IsAjaxRequest(context.Request))
  25. {
  26. context.Response.StatusCode = StatusCodes.Status401Unauthorized;
  27. context.Response.Headers["X-Login-Required"] = "true";
  28. await context.Response.WriteAsJsonAsync(new
  29. {
  30. success = false,
  31. errorCode = Common.CommonErrorCode.LoginRequired,
  32. redirectUrl = "mytel://back"
  33. });
  34. return;
  35. }
  36. context.Response.Redirect("mytel://back");
  37. }
  38. private static bool ShouldSkip(HttpContext context)
  39. {
  40. var path = context.Request.Path;
  41. if (path.StartsWithSegments("/Login")) return true;
  42. if (path.StartsWithSegments("/Home/ChangeLanguage")) return true;
  43. if (path.StartsWithSegments("/favicon.ico")) return true;
  44. if (path.StartsWithSegments("/kitty")) return true;
  45. if (path.StartsWithSegments("/css")) return true;
  46. if (path.StartsWithSegments("/js")) return true;
  47. if (path.StartsWithSegments("/lib")) return true;
  48. if (path.StartsWithSegments("/assets")) return true;
  49. return false;
  50. }
  51. private static bool IsAjaxRequest(HttpRequest request)
  52. {
  53. return string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.OrdinalIgnoreCase)
  54. || string.Equals(request.Headers["Sec-Fetch-Dest"], "empty", StringComparison.OrdinalIgnoreCase)
  55. || request.Headers.Accept.Any(x => x?.Contains("application/json", StringComparison.OrdinalIgnoreCase) == true);
  56. }
  57. }