Frage

Ich habe ein Abonnement basierte MVC 2-Anwendung mit dem grundlegenden .NET Mitgliedschaft Service im Ort (unter einigen benutzerdefinierten Komponenten das Konto / Abonnement zu verwalten, etc.). Für Benutzer, deren Konten abgelaufen sind oder die ihre Konten manuell ausgesetzt, müssen auf einen einzigen Blick in das System erhalten zu können, die den Status ihres Kontos verwaltet. Die Steuerung dieser Ansicht Fahren ist geschützt mit dem [autorisieren] Attribut.

Ich möchte sicherstellen, dass keine anderen Ansichten im System zugegriffen werden kann, bis der Benutzer wieder aktiviert hat ihr Konto. In meiner Basis-Controller (von dem alle ableiten meine geschützten Controller) Ich habe versucht, die OnActionExecuting Methode abfangen Modifizieren der Aktion, die Prüfung für ein gesperrtes Konto, und wenn es ausgesetzt ist, Umleitung auf die Einzelansicht, die den Kontostatus verwaltet. Aber das bringt mich in einer Endlosschleife. Wenn die neue Aktion getroffen wird, wird OnActionExecuting erneut aufgerufen, und der Zyklus läuft weiter.

Ich will nicht wirklich das [autorisiert] Attribut zu erweitern, kann aber, wenn es sein muss.

Jede andere Gedanken darüber, wie diese auf Controller-Ebene zu tun?

EDIT: in den Basis-Controller, ich war die Verwaltung die Umleitung (das anschließend die Umleitung Schleife erstellt) durch die filterContext.Result Eigenschaft zu modifizieren, um es in das RedirectToAction Ergebnis meiner Ansicht in Frage setzen. Ich bemerkte, jedes Mal wenn die Schleife auftritt, filterContext.Result == null. Vielleicht sollte ich gegen einen anderen Teil von filterContext Überprüfung werden?

War es hilfreich?

Lösung

Ok, also hier ist meine Lösung für den Fall hilft es jemand anderes. Es muss eine elegantere Möglichkeit, dies zu tun, und ich bin ganz Ohr, wenn jemand eine bessere Idee hat.

In meinem BaseController.cs:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ViewData["CurrentUser"] = CurrentUser; // this is a public property in the BaseController

        if (CurrentUser != null && CurrentUser.Account.Status != AccountStatus.Active)
        {
            // if the account is disabled and they are authenticated, we need to allow them
            // to get to the account settings screen where they can re-activate, as well as the logoff
            // action.  Everything else should be disabled.
            string[] actionWhiteList = new string[] { 
                Url.Action("Edit", "AccountSettings", new { id = CurrentUser.Account.Id, section = "billing" }), 
                Url.Action("Logoff", "Account")
            };

            var allowAccess = false;
            foreach (string url in actionWhiteList)
            {
                // compare each of the whitelisted paths to the raw url from the Request context.
                if (url == filterContext.HttpContext.Request.RawUrl)
                {
                    allowAccess = true;
                    break;
                }
            }

            if (!allowAccess)
            {
                filterContext.Result = RedirectToAction("Edit", "AccountSettings", new { id = CurrentUser.Account.Id, section = "billing" });
            }
        }

        base.OnActionExecuting(filterContext);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top