Как сделать действительно простую модель безопасности в приложении MVC? - PullRequest
0 голосов
/ 05 ноября 2011

Я хочу сделать что-то похожее на следующее

if (Session["UserId"] == null)
            {
                RedirectToRoute("Default");
            }

Так что любой, кому не был предоставлен сеанс (на моей странице входа в систему), будет выгнан на страницу входа.Как бы я это сделал, чтобы это произошло на

1) выбранных действиях по моему выбору 2) на всех действиях, если это необходимо

Ответы [ 2 ]

5 голосов
/ 05 ноября 2011

Самый чистый способ - реализовать его с помощью фильтров действий. Как-то так должно начаться:

class UserLoggedInAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext) {
        if(filterContext.HttpContext.Session["UserId"] == null) {
            filterContext.Result = new RedirectToRouteResult("Default");
        }
    }
}

Тогда это просто вопрос украшения ваших контроллеров и / или действий с этим атрибутом:

[UserLoggedIn]
public class YourController {

}
4 голосов
/ 05 ноября 2011

Это поведение по умолчанию атрибута [Authorize]. Таким образом, вы можете выборочно декорировать действия контроллера, требующие авторизации, по этому атрибуту:

[Authorize]
public ActionResult SomeAction()
{
    ...
}

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

У вас также есть возможность написать собственный атрибут авторизации на основе ваших конкретных требований. Например:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.Session["UserId"] != null;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // if the user doesn't have the userid value in session
        // redirect him to the index action on the home controller
        var values = new { controller = "Home", action = "Index" };
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(values));
    }
}

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

[MyAuthorize]
public ActionResult SomeAction()
{
    ...
}

Теперь, когда вы аутентифицируете пользователя в действии входа в систему (которое, очевидно, не должно быть украшено каким-либо атрибутом authoraztion), при наличии действительных учетных данных вы добавляете свойство UserId в сеанс и перенаправляете на какое-то другое действие контроллера, которое само по себе украшен этим атрибутом и требует аутентификации.

Однако для большинства случаев достаточно атрибута Authorize по умолчанию.

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