Как защитить всю область MVC с помощью IP / роли / пользователя?
Я знаю, что в MVC в верхней части контроллера можно использовать атрибут [Authorize()]
, чтобы ограничить доступ ко всему контроллеру определенным аутентифицированным пользователям и/или ролям, но не по IP, но это должно быть сделано на каждом экземпляре контроллера. Существует ли способ ограничить доступ ко всей области MVC аутентифицированным пользователем / ролью или IP-адресом источника запроса?
1 ответ:
Создайте базовый контроллер в вашем регионе:
[AuthorizeArea(AllowIpAddresses = new [] {"1.1.1.1", "1.2.3.4"})] public class CustomAreaBaseController : Controller { public CustomAreaBaseController() { // possibly any other common code that you want to run for all controllers in this area } }
Пусть все контроллеры в вашем регионе происходят от базового контроллера:
public class HomeController : CustomAreaBaseController { // actions for this controller }
Создать пользовательский атрибут авторизации:
public class AuthorizeArea : AuthorizeAttribute { public string[] AllowIpAddresses { get; set; } protected override bool AuthorizeCore(HttpContextBase httpContext) { bool isValid = false; if (httpContext == null) throw new ArgumentNullException("httpContext"); // get current ip address var ipAddress = httpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(ipAddress)) ipAddress = httpContext.Request.ServerVariables["remote_host"]; if (AllowIpAddresses.Contains(ipAddress)) isValid = true; return base.AuthorizeCore(httpContext) && isValid; } }