Наконец, я пришел к тому, что хотел - перехватывать запросы пользователей и перенаправлять на основе определенного cookie. Это можно использовать как nuget, так как у нас есть несколько приложений, и сохранение файлов cookie может быть сделано из одного приложения. Так как он сделан как атрибут фильтра действий, он может быть расположен над контроллером:
[MyAcceptCookieCheck]
public class HomeController : Controller
Это упрощает внедрение во всех приложениях, а операции, связанные с сохранением файлов cookie, будут выполняться из одного приложения, поэтому любые изменения будут легко выполняться, т. Е. Только из одного места.
public class MyAcceptCookieCheck : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var cookies = filterContext.HttpContext.Request.Cookies["OurAcceptCookie"];
var values = filterContext.RouteData.Values.Values;
originalRequest = filterContext.HttpContext.Request.Url.AbsoluteUri;
RouteValueDictionary requestOrigin = new RouteValueDictionary { {
"url", originalRequest } };
if (cookies == null && !values.Contains("CookieConsent")) //so that it won't loop endlessly
{
UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);
//filterContext.Result = new RedirectResult(urlHelper.Action("CookieConsent", "Home"));
filterContext.Result = new RedirectResult(urlHelper.Action("CookieConsent","Cookie",requestOrigin ,"https","www.my-domain.com/mysitename"));
}
else if(cookies != null)
{
string controllerName = filterContext.RouteData.Values["controller"].ToString();
string actionName = filterContext.RouteData.Values["action"].ToString();
UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);
filterContext.Result = new RedirectResult(urlHelper.AbsolutePath(actionName, controllerName));
}
}
}
Код для AbsolutePath ( вежливость ):
public static string AbsolutePath(this UrlHelper url, string actionName, string controllerName, object routeValues = null)
{
string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
Теперь я могу перенаправить все запросы, не используя этот конкретный файл cookie, на страницу согласия на использование файлов cookie, показать пользователю все подробности об использовании файлов cookie и запросить разрешение на сохранение «ConsentCookie».