Как защитить всю область MVC с помощью IP / роли / пользователя?


Я знаю, что в MVC в верхней части контроллера можно использовать атрибут [Authorize()], чтобы ограничить доступ ко всему контроллеру определенным аутентифицированным пользователям и/или ролям, но не по IP, но это должно быть сделано на каждом экземпляре контроллера. Существует ли способ ограничить доступ ко всей области MVC аутентифицированным пользователем / ролью или IP-адресом источника запроса?

1 8

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;
    }
}