Domanda

Ho fatto un nuovo filtro azione (attributo, simile a [Authorize]) che autorizza l'accesso ad un'azione di controllo sulla base di un valore di sessione. Comunque, sto praticamente decorare tutte le mie azioni di controllo con l'attributo (con l'eccezione di pochissimi).

Così, ho pensato che sarebbe stato meglio avere che Operazione filtro sempre eseguito tranne nei casi in cui allego un [ExemptFromAuthorize] attribuiscono ad un'azione di controllo? (Forse via ereditando alla mia classe Controller?)

Come posso fare questo?

È stato utile?

Soluzione

jeef3 risposta s ', mi si avvicinò con questo. Si potrebbe usare più il controllo degli errori e la robustezza come più azioni delimitati, ma l'idea generale funziona.

Nel vostro caso specifico, si potrebbe verificare il valore di sessione e decidere di tornare fuori l'autorizzazione anche.

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
    public string Exemption { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.RouteData.GetRequiredString("action") == Exemption)
            return;

        base.OnAuthorization(filterContext);
    }

}

Utilizzo:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...

Altri suggerimenti

Guarda il mio articolo su CodeProject -

http://www.codeproject.com/KB/web-security/ AuthorizeWithExemptions.aspx

In questo articolo, io vi fornirò una soluzione per proteggere i controller dell'applicazione ASP.NET MVC in modo che tutte le azioni siano fissati ad eccezione di quelli di definire come non protetta.

snipper dal codice:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ActionDescriptor action = filterContext.ActionDescriptor;
    bool IsUnsecured = action.GetCustomAttributes(
                         typeof(UnsecuredActionAttribute), true).Count() > 0;

    //If doesn't have UnsecuredActionAttribute - then do the authorization
    filterContext.HttpContext.SkipAuthorization = IsUnsecured;

    base.OnAuthorization(filterContext);
}

aver capito la domanda è piuttosto vecchio, ma comunque .. Se si desidera applicare il filtro a tutte le azioni è sufficiente aggiungere le seguenti linee in Global.asax:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

E nel filtro azione che si può solo verificare se l'azione ha qualche altri attributi in questo modo:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}

Forse provare e aggiungere una proprietà Except al primo attributo?

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}

È possibile aggiungere l'attributo alla classe di averlo si applica a tutti i metodi in quella classe

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Non so come escludere un metodo specifico da un attributo a livello di classe. Forse utilizzare un controller separato per le richieste non autenticate?

  

Per chiunque leggendo questo in 2013+, MVC4 ora supporta l'uso di   [AllowAnonymous]

     

È possibile inserire Autorizza sul controller, e quindi consentire Anonimo su   le funzioni non si vuole autorizzare.

     

Esempio:

     

[Autorizza]   public class HomeController: Controllore {

[AllowAnonymous]
public ActionResult Index()
{

} 
     

}

Sarebbe questo lavoro con un filtro personalizzato [MyAuthorize] o lo fa funzionare solo con [Autorizza]

Per chiunque leggendo questo in 2013+, MVC4 ora supporta l'uso di [AllowAnonymous]

È possibile inserire Autorizza sul controller, e quindi consentire Anonimo su tutte le funzioni che non si desidera autorizzare.

Esempio:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top