Вот код, который я использую для аналогичного требования, с парой дополнительных функций, облегчающих тестирование. Его можно настроить как глобальный фильтр, хотя я предпочитаю применять его к контроллерам / действиям индивидуально, чтобы перед запуском были доступны определенные страницы.
Обратите внимание, что это возвращает ViewResult, а не RedirectResult - таким образом сохраняется оригинальный URL, что означает, что если кто-то с нужной ролью входит в систему со страницы заполнителя, он может быть перенаправлен на URL, который он первоначально запрашивал.
public sealed class PreviewAuthAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
// todo: if site is live, show page
if (DataStore.Instance.Settings.Get("islive") == "True") return;
// if request is from localhost or build server, show page
if (filterContext.HttpContext.Request.IsLocal) return;
if (filterContext.HttpContext.Request.UserHostAddress.StartsWith("192.168.0")) return;
// if user has has beta role, show page
if (filterContext.HttpContext.Request.IsAuthenticated && (filterContext.HttpContext.User.IsInRole("Beta"))) return;
// site is not live and user does not have access - show placeholder
filterContext.Result = new ViewResult()
{
ViewName="Placeholder",
ViewData = filterContext.Controller.ViewData,
TempData = filterContext.Controller.TempData
};
}
}