Переопределить атрибут Authorize в ASP.NET MVC


У меня есть базовый класс контроллера MVC, к которому я применил атрибут Authorize, так как я хочу, чтобы почти все контроллеры (и их действия) были авторизованы.

однако мне нужно иметь контроллер и несанкционированное действие другого контроллера. Я хотел быть в состоянии украсить их с [Authorize(false)] или что-то, но это не доступно.

какие идеи?

4 78

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);
            }
        }
    }
}