Frage

Ich habe einen neuen Aktionsfilter (Attribut ähnlich wie [Autorize]) erstellt, der den Zugriff auf eine Controller -Aktion basierend auf einem Sitzungswert autorisiert. Ich dekoriere jedoch im Grunde genommen alle meine Controller -Aktionen mit diesem Attribut (mit Ausnahme von sehr wenigen).

Ich dachte, es wäre besser, diesen Aktionsfilter zu haben stets hingerichtet außer In Fällen, in denen ich ein [ausgenommenes] Attribut an eine Controller -Aktion beifügt? (Vielleicht durch Erben an meine eigene Controller -Klasse?)

Wie kann ich das machen?

War es hilfreich?

Lösung

Laufen mit JEEF3Die Antwort, ich habe mir das ausgedacht. Es könnte mehr Fehlerprüfung und Robustheit wie mehrere abgrenzende Aktionen verwenden, aber die allgemeine Idee funktioniert.

In Ihrem speziellen Fall können Sie den Sitzungswert testen und sich auch entscheiden, auch die Autorisierung zurückzugeben.

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

}

Verwendungszweck:

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

Andere Tipps

Schauen Sie sich meinen Artikel zu CodeProject - an -

http://www.codeprroject.com/kb/web-security/authorizewithexemptions.aspx

In diesem Artikel werde ich Ihnen eine Lösung zur Sicherung der Controller der ASP.NET -MVC -Anwendung auf eine Weise zur Verfügung stellen, dass alle Aktionen gesichert sind, mit Ausnahme derjenigen, die Sie als unsicher definieren.

Snipper aus dem Code:

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

Ich verstehe, dass die Frage ziemlich veraltet ist, aber trotzdem. Wenn Sie Filter auf alle Aktionen anwenden möchten, fügen Sie einfach folgende Zeilen zu global.asax hinzu:

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

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

Und in Aktionsfilter können Sie nur überprüfen, ob die Aktionen andere Attribute auf folgende Weise enthält:

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

Vielleicht versuchen Sie eine hinzuzufügen Except Eigenschaft zu Ihrem ersten Attribut?

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

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

Sie können das Attribut zur Klasse hinzufügen, damit es für alle Methoden dieser Klasse angewendet wird

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

Ich weiß nicht, wie ich eine bestimmte Methode aus einem Attribut auf Klassenebene ausschließen kann. Vielleicht einen separaten Controller für nicht authentifizierte Anfragen verwenden?

Für alle, die dies 2013+ lesen, unterstützt MVC4 nun die Verwendung von [Denanonyme].

Sie können den Controller autorisieren und dann Anonymous über alle Funktionen erlauben, die Sie nicht autorisieren möchten.

Beispiel:

Autorize] Homecontroller der öffentlichen Klasse: Controller {

[AllowAnonymous]
public ActionResult Index()
{

} 

}

Würde dies mit einem benutzerdefinierten [Myauthorize] -Filter funktionieren oder funktioniert es nur mit [Autorize

Für alle, die dies 2013+ lesen, unterstützt MVC4 jetzt die Verwendung von [AllowAnonymous]

Sie können den Controller autorisieren und dann Anonymous über alle Funktionen erlauben, die Sie nicht autorisieren möchten.

Beispiel:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top