Можно ли [Авторизовать] на уровне области в ASP.NET MVC 2? - PullRequest
3 голосов
/ 26 августа 2010

Удар по атрибутам [Authorize] на контроллерах и действиях для ограничения доступа - это круто.

Возможно ли сделать эквивалент для всей области в MVC 2?Где я могу ограничить доступ по всей территории в зависимости от ролей / пользователей / чего угодно в центральном месте, вместо того, чтобы засорять их на всех контроллерах?

Ответы [ 2 ]

7 голосов
/ 26 августа 2010

Вы можете использовать базовый контроллер, украшенный этим атрибутом, из которого происходят все ваши контроллеры в области.

1 голос
/ 11 сентября 2015

Для MVC 3 и выше:

Я только начал с этого ... но до сих пор это работает довольно хорошо для меня.

Я создаю собственный класс AuthorizeAttribute и добавляю его вфункция RegisterGlobalFilters.

В CustomAuthorizeAttribute я проверяю различные условия в зависимости от области, в которой он находится.

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomAuthorizeAttribute());
        filters.Add(new HandleErrorAttribute());
    }
}

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var routeData = httpContext.Request.RequestContext.RouteData;
        var controller = routeData.GetRequiredString("controller");
        var action = routeData.GetRequiredString("action");
        var area = routeData.DataTokens["area"];
        var user = httpContext.User;
        if (area != null && area.ToString() == "Customer")
        {
            if (!user.Identity.IsAuthenticated)
                return false;
        }
        else if (area != null && area.ToString() == "Admin")
        {
            if (!user.Identity.IsAuthenticated)
                return false;
            if (!user.IsInRole("Admin"))
                return false;
        }
        return true;
    }
}
...