2015-11-26 9 views
12

Ich schreibe meine erste ASP.NET Web API-Anwendung. Ich kenne andere Webanwendungs-Frameworks (hauptsächlich Symfony, aber auch Django und in geringerem Maße RoR).Abrufen und persistieren Zustand über Anfragen

Ich habe ein wenig Mühe, die Reihenfolge der Ereignisse zu verstehen, die auftreten, nachdem eine Anfrage von einem Browser/Front-End-Client an den Webserver gesendet wurde.

Ich schreibe eine Multi-Tenanted-Anwendung, die ein DB-Backend verwendet. Ich verwende ADO und RAW-SQL, um auf die Datenbank zuzugreifen, ich muss auch viele Informationen pro Benutzer speichern, so dass ich im Grunde einen vorinstallierten Kontext für den Benutzer erstellen (oder aus dem Cache abrufen).

Hier ist ein Pseudo-Code, der veranschaulicht, was ich versuche, in ASP.NET zu erreichen.

namespace myApp.Controllers 
{ 
    public class FoobarController : ApiController 
    { 
     public Response doLogin(request) 
     { 
      var ctx = myApplicationContext.getInstance(); 
      var user = ctx.getUser();  

      if (!user.isLoggedOn()) 
      { 
       username = request.getParameter('username'); 
       password= request.getParameter('password'); 

       dbManager = ctx.getDbInstance(); 

       resp = dbManager.internalLogin(username, password); 

       // Load permissions etc for current user, from db 
       // Store user info in cache .. 
      } 
     }  

     public Response ActionOne(request) 
     { 
      ctx = myApplicationContext.getInstance(); 
      user = ctx.getUser(); 

      if (user.hasPermission('xxx')) 
      { 

      } 
     } 
    } 
} 

Meine Frage ist, wie kann ich diese Art von Funktionalität implementieren:

Nämlich:

  • einen Anwendungskontext erstellen, in dem ich mit kontextsensitiven Informationen wie eine bevölkern können Datenbankverbindung, Mailerkonfiguration, Objektfabriken, verschiedene Statusinformationen usw.

  • Zugriff auf ein Benutzerobjekt (das ich anzeigen kann d Benutzeranmeldeinformationen, Berechtigungen usw.)

  • Zugriff auf Sitzungsvariablen usw. haben?

Hinweise

  1. Ich werde die Web-App unter Linux werden die Bereitstellung, und ich werde Apache als Webserver verwenden.
  2. Für den Zweck dieses Projekts möchte ich keine Microsoft-Technologie wie Azure, Windows Authentications etc. (außer C# und ASP.Net) verwenden
  3. Ich möchte eine rohe Datenbankverbindung verwenden, keine Entity Manager (Legacy-Anwendung Port)
+2

Haben Sie OWIN und ASP Identität sah in? Identity kommt mit der Vorlage von ASP-Anwendungen in diesen Tagen, wie OWIN, und es wird alle Ihre Auth-Bedürfnisse behandeln. OWIN ist ein grundlegenderer Rahmen, auf dem (theoretisch) alles andere sitzt - wenn Sie Ihr eigenes Auth-Framework nur zum Lernen aufbauen möchten, würde ich mit OWIN beginnen. Es gibt einige Tutorials auf der ASP.net-Website. –

Antwort

5

ich ein bisschen habe Schwierigkeiten, die Abfolge der Ereignisse zu verstehen, die auftreten, nachdem eine Anforderung von einem Browser/Frontend-Client gesendet wird, auf dem Web-Server.

Dafür würde ich sagen this PDF Poster gibt beste bildliche Darstellung der Anfrage Verarbeitung in ASP.NET WebAPI.

Meine Frage ist, wie kann ich diese Art von Funktionalität implementieren:

Nämlich:

  • einen Anwendungskontext erstellen, in dem ich mit kontext sensible Informationen wie eine bevölkern können Datenbankverbindung, Mailer Konfiguration, Objektfabriken, verschiedene Statusinformationen usw.

  • Zugriff ein Benutzer-Objekt (die ich Anmeldeinformationen Benutzer hinzufügen können, Berechtigungen etc)

  • Haben Sie Zugriff auf Session-Variablen etc?

dies Denn ich sagen würde, staatenlos und ist so, bester Ansatz zu sein WebAPIs ist entworfen, um eine persistente Sitzung (Say in der Datenbank) und verwendet eine Kennung für Sitzung (wie Sitzungsschlüssel oder Token) zu erstellen für jede Anfrage, um einen Benutzer zu identifizieren und seine Sitzungsvariablen/Kontextinformationen abzurufen.

Nun, um die Art von Funktionalität zu implementieren, die Sie in Ihrem Beispiel gefordert haben, würde das durch eine Kombination von Authentifizierungsfiltern und Autorisierungsfiltern (More details on implementing them here) erreicht werden.

Jede Anforderung in WebAPI wird zuerst von Handlern verarbeitet und dann werden vor Ausführung der angeforderten Aktion Filter angewendet. In Ihrem Beispiel haben Authentifizierungsfilter die Funktion DoLogin und die Logik user.hasPermission befindet sich in Autorisierungsfiltern und nur Aktionslogik befindet sich in der Aktion (Funktion) im Controller.

enter image description here

+0

Danke für Ihre Antwort. Allerdings war mir dieser pdf-Schaltplan bereits bekannt. Leider hilft es nicht viel, da es voraussetzt, dass der Leser bereits mit ASP.Net-Klassen/Namespaces usw. vertraut ist. Was ich suchte, war ein Diagramm, das Konzepte im Workflow auf Framework-Klassen abbildete - Das Diagramm wie es ist, schaut über Engineered IMHO. Wenn das alles nicht klappt, wäre es zumindest nützlich zu sehen, wie ich meine eigenen Authentifizierungs- und Autorisierungsfilter schreiben kann. –

+0

Genau genommen sah das Diagramm auf den ersten Blick auch für mich aus. Aber sobald ich ein grundlegendes Verständnis von webAPI erlangt habe, ist diese Beteiligung ein wichtiger Punkt für jede Klärung, die ich für mich selbst brauche. Dieser Link enthält weitere Details zum Implementieren der Autorisierung und Authentifizierung. Ich werde das auch in meiner Antwort aktualisieren. - http://www.asp.net/web-api/overview/security/authentication-and-authorisation-in-aspnet-web-api – Guanxi