Können Sie [autorisieren] für Controller ermöglichen, aber es für eine einzelne Aktion deaktivieren?

StackOverflow https://stackoverflow.com/questions/329500

  •  11-07-2019
  •  | 
  •  

Frage

Ich mag [Authorize] in meinem Admin-Controller für jede Aktion verwenden, mit Ausnahme der Login Aktion.

[Authorize (Roles = "Administrator")]
public class AdminController : Controller
{
    // what can I place here to disable authorize?
    public ActionResult Login()
    {
        return View();
    }
}
War es hilfreich?

Lösung

Ich glaube nicht, dass Sie dies mit dem Standard-Attribute Autorisieren tun können, aber Sie können Ihr eigenes Attribut aus AuthorizeAttribute ableiten, die eine Liste von Aktionen nehmen zu ermöglichen und den Zugang erlauben nur auf diese Aktionen. Sie können für die AuthorizeAttribute an der Quelle sehen www.codeplex.com für Ideen, wie dies zu tun. Wenn ja, könnte es wie folgt aussehen:

[AdminAuthorize (Roles = "Administrator", Exempt = "Login, Logout") ]
public class AdminController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

    public ActionResult Login()
    {
        return View();
    }

    ... other, restricted actions ...
}

Bearbeiten : FYI, ich lief schließlich über eine Notwendigkeit, etwas ähnliches auf meinem eigenen zu tun, und ich ging in eine andere Richtung. Ich habe einen Filter Provider Standardberechtigung und gelte einen globalen authorise Filter. Der Zulassungsfilter Anbieter verwendet Reflektion zu überprüfen, ob eine Aktion oder einen Controller eine bestimmte authorise hat Attribut angewandt, und wenn ja, um es aufschiebt. Ansonsten gilt es ein Standard-Berechtigungsfilter. Dies wird in Verbindung mit einem von PublicAttribute AuthorizeAttribute abgeleitet, die den öffentlichen Zugang ermöglicht. Nun, ich Standardzugriff gesichert, kann aber den Zugang der Öffentlichkeit über [Public] auf eine Aktion oder eine Steuerung angewendet gewähren. Mehr können spezifische Genehmigung auch bei Bedarf angewendet werden. Sehen Sie mein Blog unter http: // frisch vom Bauernhof -code.blogspot.com/2011/04/default-authorization-filter-provider.html

Andere Tipps

Sie können Ihren Controller mit [autorisieren] dekorieren und dann können Sie nur die Methode dekorieren, die Sie mit befreien wollen [AllowAnonymous]

Sie könnten die OnAuthorization Methode der Steuerung außer Kraft setzen

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Login")
        {
            filterContext.Cancel = true;
            filterContext.Result = Login();
        }
    }

Dies funktioniert, aber es ist ein Hack.

Voll Klasse Code zum Testen verwendet:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication2.Controllers
{
[HandleError]
[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Title"] = "Home Page";
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }


    public ActionResult About()
    {
        ViewData["Title"] = "About Page";

        return View();
    }


    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Index")
        {
            filterContext.Cancel = true;
            filterContext.Result = Index();
        }
    }
}
}

Vielleicht ist es nicht unbedingt, aber ich habe meine benutzerdefinierten Attribute:

public class SelectableAuthorizeAttribute : AuthorizeAttribute
{
    public SelectableAuthorizeAttribute(params Type[] typesToExclude)
    {
        _typesToExlude = typesToExclude;
    }

    private readonly Type[] _typesToExlude;

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool skipAuthorization = _typesToExlude.Any(type => filterContext.ActionDescriptor.ControllerDescriptor.ControllerType == type);

        if (!skipAuthorization)
        {
            base.OnAuthorization(filterContext);
        }
    }
}

Und dann registriert es in meinem globalen filetrs:

filters.Add(new SelectableAuthorizeAttribute(typeof(MyController)));

Ich hoffe, dass es für jemanden nützlich sein wird,

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