ASP MVC Разрешить все действия, за исключением нескольких
У меня есть контроллер, и я хотел бы потребовать авторизацию для всех действий по умолчанию, кроме пары. Поэтому в приведенном ниже примере все действия должны требовать аутентификации, кроме Индекса. Я не хочу, чтобы украшать каждое действие с помощью Авторизованного, я просто хочу переопределить авторизацию по умолчанию при определенных обстоятельствах, вероятно, с помощью настраиваемого фильтра, такого как NotAuthorize.
[Authorize]
public class HomeController : BaseController
{
[NotAuthorize]
public ActionResult Index()
{
// This one wont
return View();
}
public ActionResult About()
{
// This action will require authorization
return View();
}
}
Ответы
Ответ 1
Хорошо, это то, что я сделал. Если есть лучший способ, дайте мне знать.
public class NotAuthorizeAttribute : FilterAttribute
{
// Does nothing, just used for decoration
}
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Check if this action has NotAuthorizeAttribute
object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (attributes.Any(a => a is NotAuthorizeAttribute)) return;
// Must login
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
Ответ 2
Как насчет [AllowAnonymous]
??
Ответ 3
MVC4 имеет новый атрибут, специально предназначенный для этого [AllowAnonymous]
(как указано Enrico)
[AllowAnonymous]
public ActionResult Register()
Подробнее читайте здесь:
http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx
Ответ 4
Вот что я хотел бы сделать, подобно Крэйгу, ответив на пару изменений:
1) Создайте обычный атрибут, полученный из System.Attribute(нет необходимости выводить из FilterAttribute, поскольку вы не собираетесь использовать что-либо, что предоставляет FilterAttribute).
Возможно, создайте иерархию классов атрибутов, чтобы вы могли протестировать на основе иерархии, например.
Attribute
AuthorizationAttribute
AuthorizationNotRequiredAttribute
AuthorizationAdminUserRequiredAttribute
AuthorizationSuperUserRequiredAttribute
2) В вашем BaseController переопределите метод OnAuthorization
, а не метод OnActionExecuting
:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
var authorizationAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<AuthorizationAttribute>();
bool accountRequired = !authorizationAttributes.Any(aa => aa is AuthorizationNotRequiredAttribute);
Мне нравится подход к безопасности по умолчанию: даже если вы забудете указать атрибут в Action, он, по крайней мере, потребует входа пользователя в систему.
Ответ 5
Используйте специальный фильтр, как описано в Защитите приложение ASP.NET MVC 3.
Ответ 6
Отметьте контроллер с помощью [Авторизовать]
[Авторизоваться]
public class YourController: ApiController
Отметьте действия, которые вы хотите публиковать, с помощью
[AllowAnonymous]
Ответ 7
Немного поздно вечеринке, но в итоге я создал атрибут auth на уровне контроллера и атрибут auth на уровне Action и просто пропустил аутентификацию Controller, если у Action был свой собственный атрибут Auth. Смотрите код здесь:
https://gist.github.com/948822