Domanda

Ho bisogno di scrivere del codice per trovare un ID nel mio database di un progetto. Gli utenti sono accoppiati ad un progetto e tutti i progetti hanno un sacco di collegamenti ad altri oggetti, come ad esempio sessioni.

Ora ho bisogno di controllare prima di eseguire qualsiasi azioni, se l'utente tenta di accedere al Session, è collegata allo stesso progetto come la sessione è collegato.

Per questo voglio usare un [Attributo] sulle Azioni. MVC: la creazione di un custom [AuthorizeAttribute] che prende parametri ?

Questa domanda e risposta mi ha iniziato, ma sto avendo difficoltà utilizzando il costruttore del controller per ottenere la mia Project ID

L'obiettivo è che posso scrivere del codice in ogni costruttore, di tutti i miei controllori di oggetti a seconda dei progetti, trovare l'ID del progetto, e di renderla accessibile (pubblico), quindi il mio [customauthorize] avranno accesso a questo progetto ID per verificare se l'utente ha accesso o meno.

Il mio problema:

public class SessionController : Controller {

    NASDataContext _db = new NASDataContext();


    public SessionController() {
        var test = RouteData;
        var ses = _db.Sessies.First(q=>q.Ses_ID==1);
    }

Come faccio ad accedere RouteData? RouteData è nullo, HttpContext è nullo e Request è nullo.

Ho bisogno l'ID nell'URL, che si trova nel RouteData ...

È stato utile?

Soluzione

Vorrei suggerire mettendo questo controllo nel Modello piuttosto che il Controller. Nel controller è necessario per decorare ogni azione che richiede questo controllo, ricordate questo sta andando eseguire codice su ogni azione si applica a quindi probabilmente non si vuole applicare a livello di controllo per iniziare. L'approccio più semplice è quello di implementare il controllo di una volta nel modello allora non hai 'preoccupazione' nel controller di diritti di accesso. Questo renderà la sperimentazione di questo accesso controllare destra possibile, come avrete solo il test in un unico luogo.

Altri suggerimenti

Questo è quello che ho fatto oggi per risolvere il problema e sono abbastanza felice.

Modulo parziale:

public partial class Module {
    public string FullName {
        get {
            return Mod_Code + " " + Mod_Titel;
        }
    }
    public string ShortName {
        get {
            return Mod_Code;
        }
    }
    public bool IsAccessible() {
        return this.Projecten.IsAccessible();
    }
}

Progetti parziale:

public partial class Projecten {
    public string FullName {
        get {
            if (Proj_Kortenaam == Proj_Naam)
                return Proj_Kortenaam;

            return Proj_Kortenaam + " " + Proj_Naam;
        }
    }
    public string ShortName {
        get {
            return Proj_Kortenaam;
        }
    }

    public bool IsAccessible() {
        return IsAccessible(HttpContext.Current.User);
    }

    public bool IsAccessible(IPrincipal user) {
        //this code checks if the user can access or not
        return MvcApplication.projectToegankelijk(user, this._Proj_ID);
    }
}

poi in moduli di controllo

    [NonAction]
    public ActionResult noRights() {
        ViewData["delError"] = "You have no rights.";
        return View("Error");
    }

    //
    // GET: /Modules/Details/5
    public ActionResult Details(int id) {
        var mod = _db.Modules.First(q => q.Mod_ID == id);
        if (mod.IsAccessible()) {
            return View(mod);
        }
        return noRights();
    }

Credo che questo funziona abbastanza carino:)

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