Изменить: поскольку ASP.NET MVC 4, лучший подход - просто использовать встроенный атрибут AllowAnonymous .
Ответ ниже относится к более ранним версиям ASP.NET MVC.
Вы можете создать настраиваемый атрибут авторизации, наследующий от стандартного AuthorizeAttribute, с необязательным параметром bool, чтобы указать, требуется ли авторизация или нет.
public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
private readonly bool _authorize;
public OptionalAuthorizeAttribute()
{
_authorize = true;
}
public OptionalAuthorizeAttribute(bool authorize)
{
_authorize = authorize;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(!_authorize)
return true;
return base.AuthorizeCore(httpContext);
}
}
Затем вы можете украсить свой базовый контроллер этим атрибутом:
[OptionalAuthorize]
public class ControllerBase : Controller
{
}
и для любых контроллеров, для которых вам не нужна авторизация, просто используйте переопределение со значением false - например,
[OptionalAuthorize(false)]
public class TestController : ControllerBase
{
public ActionResult Index()
{
return View();
}
}
[AllowAnonymous]
атрибут.Кажется, что ASP.NET MVC 4 «исправил» это, добавив атрибут AllowAnonymous .
Дэвид Хайден писал об этом :
[Authorize] public class AccountController : Controller { [AllowAnonymous] public ActionResult Login() { // ... } // ... }
источник
Я лично считаю, что нужно разделить контроллер. Просто создайте еще один контроллер. Для действий вам не нужна аутентификация.
Или вы могли бы:
BaseController
не требует аутентификации - вот и вся ваша "база" :).
BaseAuthController : BaseController
все действия здесь требуют аутентификации.
Таким образом, вы можете иметь аутентификацию, когда захотите, просто унаследовав ее от определенного класса.
источник
Если вы просто хотите, чтобы одно действие было неавторизованным на авторизованном контроллере, вы можете сделать что-то вроде этого:
public class RequiresAuthorizationAttribute : ActionFilterAttribute { private readonly bool _authorize; public RequiresAuthorizationAttribute() { _authorize = true; } public RequiresAuthorizationAttribute(bool authorize) { _authorize = authorize; } public override void OnActionExecuting(ActionExecutingContext filterContext) { var overridingAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof (RequiresAuthorizationAttribute), false); if (overridingAttributes.Length > 0 && overridingAttributes[0] as RequiresAuthorizationAttribute != null && !((RequiresAuthorizationAttribute)overridingAttributes[0])._authorize) return; if (_authorize) { //redirect if not authenticated if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { //use the current url for the redirect var redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; //send them off to the login page //var redirectUrl = string.Format("?RedirectUrl={0}", redirectOnSuccess); var loginUrl = LinkBuilder.BuildUrlFromExpression<HomeController>(filterContext.RequestContext, RouteTable.Routes, x => x.Login(redirectOnSuccess)); filterContext.HttpContext.Response.Redirect(loginUrl, true); } } } }
источник