Как отследить действия анонимных пользователей в ASP.Net MVC 5?
Я создаю ASP.Net MVC 5
веб-приложение, услугами которого могут пользоваться анонимные пользователи. Когда анонимный пользователь использует веб-сервис, он выполняет некоторый запрос из базы данных. Однако по соображениям безопасности мой клиент хочет отслеживать "подозрительные" действия анонимных пользователей. Один из них включает количество запросов анонимного пользователя в день (для предотвращения кражи значительного объема данных).
Есть ли способ получить эту информацию?
Для зарегистрированного пользователя мы можем создать дополнительное свойство в ApplicationUser
называется QueryNo
и добавить его в Claim
как это:
public class ApplicationUser : IdentityUser {
public uint QueryNo { get; set; } //how many times this user has queried
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) {
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("QueryNo", QueryNo));
return userIdentity;
}
}
И когда мы хотим отслеживать его активность, мы могли бы просто увеличить его QueryNo
за запрос деятельности. Когда мы хотим отобразить это, мы могли бы, например, просто определить расширение для Identity
как это:
public static class IdentityExtensions {
public static string GetQueryNo(this IIdentity identity) {
if (identity == null) {
throw new ArgumentNullException("identity");
}
var ci = identity as ClaimsIdentity;
if (ci != null) {
return ci.FindFirstValue("QueryNo");
}
return null;
}
}
А затем просто используйте его в виде, как это:
<p>No Of Query: @User.Identity.GetQueryNo()</p>
Но как мы отслеживаем действия анонимного пользователя (например, его нет запросов)?
1 ответ
Сначала создайте свой фильтр действий:
public class TrackingActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var sessionId = filterContext.HttpContext.Session.SessionID;
Debug.WriteLine("Printing session Id: " + sessionId);
var ip = filterContext.HttpContext.Request.UserHostAddress;
Debug.WriteLine("Printing ip: " + ip);
var headers = filterContext.RequestContext.HttpContext.Request.Headers;
foreach(var header in headers) {
Debug.WriteLine("Printing header: " + header);
}
var parms = filterContext.HttpContext.Request.Params;
foreach (var key in parms.AllKeys)
{
Debug.WriteLine("Printing parameter: " + key + " - " + parms[key]);
}
var routeDataKeys = filterContext.RouteData.Values.Keys;
foreach(var key in routeDataKeys)
{
Debug.WriteLine("Printing route data value: " + key + " - " + filterContext.RouteData.Values[key]);
}
//Stolen with love from http://stackru.com/questions/12938621/how-can-i-log-all-query-parameters-in-an-action-filter
var stream = filterContext.HttpContext.Request.InputStream;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
Debug.WriteLine(Encoding.UTF8.GetString(data));
}
}
Очевидно, вы бы захватили соответствующие детали, а не просто записали их в окно отладки.
Теперь вы можете применить фильтр действий на уровне действий:
[TrackingActionFilter]
public ActionResult Index()
Или на уровне контроллера:
[TrackingActionFilter]
public class HomeController : Controller
Или вы можете охватить все ваше приложение MVC глобально через FilterConfig
:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new TrackingActionFilter());
}
}