Как использовать атрибут авторизации на 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;
}
Класс атрибута 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.