Атрибут .NET MVC 3 Custom Controller - PullRequest
4 голосов
/ 13 мая 2011

Это может быть журавль в небе, но мне интересно, можно ли выполнить следующее с помощью пользовательского атрибута контроллера.

Для большинства моих контроллеров я передам параметр URL, называемый "r "на каждое действие в контроллере.«r» связан с идентификатором гонки в таблице рас в моей базе данных.

Я хотел бы, чтобы каждый раз, когда вызывалось действие контроллера, он автоматически проверял наличие «r».", запросите базу данных, чтобы убедиться, что" r "принадлежит вошедшему в систему пользователю и установите переменную viewbag с именем ViewBag.RaceId равной" r ".

Если какое-либо из этих условий не выполняется, оно 'Я перенаправлю их обратно на страницу входа в систему.

Я пытаюсь сделать мой код максимально СУХИМЫМ.

Любое руководство будет с благодарностью.

1 Ответ

6 голосов
/ 13 мая 2011

Вы можете написать собственный атрибут Authorize:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (isAuthorized)
        {
            var request = httpContext.Request;
            // Fetch "r" from the route data or request
            var r = request.RequestContext.RouteData.Values["r"] 
                ?? request["r"];
            var currentUser = httpContext.User.Identity.Name;
            if (!CheckIfRBelongsToTheCurrentLoggedInUser(currentUser, r))
            {
                return false;
            }
        }
        return isAuthorized;
    }
}

Теперь все, что осталось, это украсить ваши контроллеры / действия с помощью этого пользовательского атрибута:

[MyAuthorize]
public ActionResult Foo()
{
    //...
}

И если выЕсли вы хотите поместить что-то в ViewBag, вы можете временно сохранить его в httpContext.Items внутри метода AuthorizeCore в случае успеха, а затем переопределить также метод OnAuthorization и проверить наличие этого элемента в контексте.Если он присутствует, вы можете сохранить его в filterContext.Controller.ViewBag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...