Как использовать атрибут авторизации на MVC3

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

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

2 ответа

Решение

Этот атрибут работает, глядя на 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.

Класс атрибута 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.

Другие вопросы по тегам