ASP.NET MVC Know Your Customers
2021-12-27
KYC 在金融業正夯,而到了資訊系統開發,就是認識你的網站拜訪。說明 ASP.NET 設計統計來訪 Requests 使用的瀏覽器技術、作業系統、螢幕比例以及來源位置等資訊,讓應用系統能夠根據統計資料加以回饋改善。
說明
資料表設計
CREATE TABLE [dbo].[KYC](
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY,
[HttpReferer] [nvarchar](256) NULL,
[UserAD] [varchar](32) NULL,
[AuthenticationType] [varchar](32) NULL,
[ClientIP] [varchar](135) NOT NULL,
[ClientPort] [int] NULL,
[Browser] [varchar](64) NULL,
[OS] [varchar](64) NULL,
[ScreenHeight] [smallint] NULL,
[ScreenWidrh] [smallint] NULL,
[ScreenRatio] [smallint] NULL,
[TimeStamp] [datetime2](7) NOT NULL,
GO
ALTER TABLE [dbo].[KYC] ADD CONSTRAINT [DF_KYC_TimeStamp]
DEFAULT (getdate()) FOR [TimeStamp]
資料欄位 | 說明 |
---|---|
Id | 流水號主鍵 |
HttpReferer | 訪問來源 |
UserAD | 使用者名稱 |
AuthenticationType | 驗證方式 Negotiate / NTLM |
ClientIP | 來源 IP |
ClientPort | 來源使用的 Port |
Browser | 瀏覽器資訊 |
OS | 作業系統 |
ScreenHeight | 使用者螢幕高度 |
ScreenWidrh | 使用者螢幕寬度 |
ScreenRatio | 使用者縮放比率 |
TimeStamp | 訪問時間戳記 |
Controller Design
為了分析作業系統與瀏覽器資訊,使用 Nuget 安裝 UAParser (3.1.47) 協助進行分析 User Agent。
[AllowCORS]
public ActionResult KYC(short sh = 0, short sw = 0, short sr = 0, string Msg = "")
{
Guests guests = new Guests();
var uaParser = UAParser.Parser.GetDefault();
var parseResult =
uaParser.Parse(HttpContext.Request.ServerVariables["HTTP_USER_AGENT"]);
guests.HttpReferer =
HttpContext.Request.ServerVariables["http_referer"];
guests.UserAD = User.Identity.Name;
guests.AuthenticationType = User.Identity.AuthenticationType;
guests.ClientIP = HttpContext.Request.UserHostAddress;
guests.ClientPort =
Int32.Parse(HttpContext.Request.ServerVariables["REMOTE_PORT"]);
guests.Browser = parseResult.UA.ToString();
guests.OS = parseResult.OS.ToString();
guests.ScreenHeight = sh;
guests.ScreenWidrh = sw;
guests.ScreenRatio = sr;
if (ModelState.IsValid)
{
db.Guests.Add(guests);
db.SaveChanges();
return Json(200, JsonRequestBehavior.AllowGet);
}
return Json(500, JsonRequestBehavior.AllowGet);
}
為了要讓不同的應用程式跨源呼叫,回應標題必須加上 Access-Control-Allow-Origin,利用 Filter 的方式設計與包裝,並修飾 Controller。
public class AllowCORSAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext
.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
Client Usage
如果是當代瀏覽器,可以使用 fetch API,但 fetch API 需要注意自組 query string:
fetch('localhost:8888/KYC/?' + new URLSearchParams({
sh: screen.height,
sw: screen.width,
sr: Math.round(window.devicePixelRatio * 100),
msg: 'fetch API'
}).toString())
為了要相容 IE11 可以改為使用 jQuery 的 get method:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous">
</script>
<script>
$.get("localhost:8888/KYC",
{
sh: screen.height,
sw: screen.width,
sr: Math.round(window.devicePixelRatio * 100),
msg: 'systemName'
});
</script>