| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- using Common.Extension;
- namespace Kitty_Fall.Website.Helpers;
- public class LoginRequiredMiddleware
- {
- private readonly RequestDelegate _next;
- public LoginRequiredMiddleware(RequestDelegate next)
- {
- _next = next;
- }
- public async Task InvokeAsync(HttpContext context)
- {
- if (ShouldSkip(context))
- {
- await _next(context);
- return;
- }
- var msisdn = context.Session.GetComplexData<string>("msisdn");
- if (!string.IsNullOrWhiteSpace(msisdn))
- {
- await _next(context);
- return;
- }
- context.Response.Headers.CacheControl = "no-store";
- if (IsAjaxRequest(context.Request))
- {
- // Ajax: quay lại trang đang đứng (Referer) sau khi đăng nhập trên trình duyệt.
- var redirectUrl = AccessChannelHelper.GetLoginRedirectUrl(context, GetLocalReferer(context.Request));
- context.Response.StatusCode = StatusCodes.Status401Unauthorized;
- context.Response.Headers["X-Login-Required"] = "true";
- context.Response.Headers["X-Login-Redirect"] = redirectUrl;
- await context.Response.WriteAsJsonAsync(new
- {
- success = false,
- errorCode = Common.CommonErrorCode.LoginRequired,
- redirectUrl
- });
- return;
- }
- var returnUrl = context.Request.Method == HttpMethods.Get
- ? $"{context.Request.PathBase}{context.Request.Path}{context.Request.QueryString}"
- : null;
- context.Response.Redirect(AccessChannelHelper.GetLoginRedirectUrl(context, returnUrl));
- }
- private static bool ShouldSkip(HttpContext context)
- {
- var path = context.Request.Path;
- if (path.StartsWithSegments("/Login")) return true;
- if (path.StartsWithSegments("/Home/ChangeLanguage")) return true;
- if (path.StartsWithSegments("/favicon.ico")) return true;
- if (path.StartsWithSegments("/kitty")) return true;
- if (path.StartsWithSegments("/css")) return true;
- if (path.StartsWithSegments("/js")) return true;
- if (path.StartsWithSegments("/lib")) return true;
- if (path.StartsWithSegments("/assets")) return true;
- return false;
- }
- private static string? GetLocalReferer(HttpRequest request)
- {
- var referer = request.Headers.Referer.ToString();
- if (string.IsNullOrWhiteSpace(referer)
- || !Uri.TryCreate(referer, UriKind.Absolute, out var uri)
- || !string.Equals(uri.Host, request.Host.Host, StringComparison.OrdinalIgnoreCase))
- {
- return null;
- }
- return uri.PathAndQuery;
- }
- private static bool IsAjaxRequest(HttpRequest request)
- {
- return string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.OrdinalIgnoreCase)
- || string.Equals(request.Headers["Sec-Fetch-Dest"], "empty", StringComparison.OrdinalIgnoreCase)
- || request.Headers.Accept.Any(x => x?.Contains("application/json", StringComparison.OrdinalIgnoreCase) == true);
- }
- }
|