|
|
@@ -0,0 +1,55 @@
|
|
|
+namespace Kitty_Fall.Website.Helpers;
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// Phân biệt truy cập từ app MyID (webview, có header phone-number) với trình duyệt thường.
|
|
|
+/// App chỉ chắc chắn gắn header ở lần mở đầu, nên khi thấy header sẽ ghi cookie lâu dài
|
|
|
+/// để các request sau (kể cả khi session đã hết hạn) vẫn nhận ra là app.
|
|
|
+/// </summary>
|
|
|
+public static class AccessChannelHelper
|
|
|
+{
|
|
|
+ public const string MyIdBackUrl = "mytel://back";
|
|
|
+ private const string ChannelCookieName = "kf_channel";
|
|
|
+ private const string MyIdChannel = "myid";
|
|
|
+
|
|
|
+ private static readonly string[] MyIdPhoneHeaders =
|
|
|
+ { "phone-number", "MSISDN", "msisdn", "phone_number", "phoneNumber" };
|
|
|
+
|
|
|
+ public static bool HasMyIdHeader(HttpRequest request)
|
|
|
+ {
|
|
|
+ return MyIdPhoneHeaders.Any(name => !string.IsNullOrWhiteSpace(request.Headers[name].ToString()));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static bool IsMyIdApp(HttpContext context)
|
|
|
+ {
|
|
|
+ return HasMyIdHeader(context.Request)
|
|
|
+ || string.Equals(context.Request.Cookies[ChannelCookieName], MyIdChannel, StringComparison.Ordinal);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void MarkMyIdApp(HttpContext context)
|
|
|
+ {
|
|
|
+ if (string.Equals(context.Request.Cookies[ChannelCookieName], MyIdChannel, StringComparison.Ordinal)) return;
|
|
|
+ if (context.Response.HasStarted) return;
|
|
|
+
|
|
|
+ context.Response.Cookies.Append(ChannelCookieName, MyIdChannel, new CookieOptions
|
|
|
+ {
|
|
|
+ HttpOnly = true,
|
|
|
+ IsEssential = true,
|
|
|
+ Secure = context.Request.IsHttps,
|
|
|
+ SameSite = SameSiteMode.Lax,
|
|
|
+ Expires = DateTimeOffset.UtcNow.AddDays(30)
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// URL chuyển hướng khi chưa đăng nhập: app → về MyID, trình duyệt → trang OTP /Login.
|
|
|
+ /// </summary>
|
|
|
+ public static string GetLoginRedirectUrl(HttpContext context, string? returnUrl = null)
|
|
|
+ {
|
|
|
+ if (IsMyIdApp(context)) return MyIdBackUrl;
|
|
|
+
|
|
|
+ var loginUrl = $"{context.Request.PathBase}/Login";
|
|
|
+ return string.IsNullOrWhiteSpace(returnUrl)
|
|
|
+ ? loginUrl
|
|
|
+ : loginUrl + "?returnUrl=" + Uri.EscapeDataString(returnUrl);
|
|
|
+ }
|
|
|
+}
|