Как использовать атрибут авторизации на MVC3 - PullRequest
9 голосов
/ 20 декабря 2011

Я читал, что для использования атрибута [Authorize] в MVC, вам просто нужно поместить его поверх действия или класса контроллера, который вы хотите защитить.

Мой вопрос: как атрибут Authorize узнает, вошел ли пользователь в систему или нет? Нужно ли предоставлять какой-либо объект Session, чтобы Authorize узнал, авторизован ли пользователь?

Ответы [ 2 ]

15 голосов
/ 20 декабря 2011

Этот атрибут работает, глядя на HttpContext.User.Identity.IsAuthenticated.

Если вы используете что-то вроде FormsAuthentication, для этого параметра будет установлено значение true, если у пользователя есть действительный файл cookie FormsAuthentication на его компьютере (который можно добавить с помощью FormsAuthentication.SetAuthCookie).

Если вас интересует внутренняя работа Authorize, это из опубликованного исходного кода Microsoft:

protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
        if (httpContext == null) {
            throw new ArgumentNullException("httpContext");
        } 

        IPrincipal user = httpContext.User; 
        if (!user.Identity.IsAuthenticated) { 
            return false;
        } 

        if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) {
            return false;
        } 

        if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
            return false; 
        }

        return true;
    }

Вот дополнительная информация о FormsAuthentication .

3 голосов
/ 25 апреля 2013

Класс атрибута Authorize по умолчанию принимает в качестве аргумента httpcontext.когда звонили.Затем он проверяет значение HttpContext.User.Identity.IsAuthenticated bool и действует соответственно.Это работает, только если вы используете проверку подлинности с помощью форм.Если вы используете собственную логику входа в систему (например, в объекте сеанса), вы можете получить класс из атрибута Authorize и вызвать его.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,     AllowMultiple = true)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        clsSession sess = httpContext.Session["Current"] as clsSession;
        if (sess.IsLogin) return true;
        return false;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new ViewResult { ViewName = "Unauthorized" };
    }
}

Затем вы можете использовать этот класс следующим образом:

[MyAuthorize]
public ActionResult Index()
{
    return View();
}

Это будет работать.Вы можете использовать [MyAuthorize] вместо [Authorize] во всех действиях контроллера.Если он возвращает false, он вернет представление (в данном случае «Unauthorized»).Имя представления может быть любым и может быть расположено в папке views / shared.

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