Переопределить атрибут Authorize в ASP.NET MVC
У меня есть базовый класс контроллера MVC, к которому я применил атрибут Authorize, так как я хочу, чтобы почти все контроллеры (и их действия) были авторизованы.
однако мне нужно иметь контроллер и несанкционированное действие другого контроллера. Я хотел быть в состоянии украсить их с [Authorize(false)]
или что-то, но это не доступно.
какие идеи?
4 ответа:
редактировать: с тех пор ASP.NET MVC 4 лучший подход-просто использовать встроенный 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); } } } }