2017-04-18 5 views
0

Ich mache eine kleine SAAS-Anwendung. Ich benutze die gleiche Datenbank für alle Benutzer und nur die Unterscheidung zwischen den Daten mit Benutzernamen und IDs. Dies bedeutet, dass der Benutzer eine neue URL in den Browser eingeben und andere Benutzerdaten sehen kann. Dies ist natürlich kein wünschenswerter Ansatz. Ich würde gerne überprüfen, ob der aktuelle Benutzer tatsächlich auf die Ressourcen zugreifen kann: z.Wie kann ich benutzerdefinierte Autorisierung in meiner ASP.NET MVC-Anwendung

http://myapplication.com/images/15 

Und wenn der Benutzer die URL

http://myapplication.com/images/16 

ändert soll ich einen Scheck in meiner Datenbank zu sehen, tun, wenn der aktuelle Benutzer Zugriff hat tatsächlich die Bilder mit Benutzer-ID 16 zu sehen, und wenn nicht auf eine "nicht autorisierte" Seite umleiten.

Wie implementiere ich das?

+0

Überprüfen Sie diesen Artikel: https://weblogs.asp.net/jongalloway/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way – TrevorBrooks

Antwort

0

Der erste Schritt, um sicherzustellen, Datei-Datei ist, dass Sie nie für den Benutzer selbst keine IDs haben in die URL Zum Beispiel niemals http://example.com/?user=10. Sie sollten die Benutzer-ID immer von ihrer Authentifizierung erhalten und nicht von der URL (oder den gebuchten Werten).

Der zweite Schritt besteht darin, diese ID in Ihren Abfragen zu verwenden. Nehmen wir zum Beispiel an, dass sie http://example.com/images/100 suchen, dann sollten Sie in Ihrer Datenbank einen Mechanismus haben, der die Eigentümerschaft des Assets mit dem Benutzer verknüpft, entweder eine Benutzer-ID oder eine Zuordnungstabelle von IDs zu Assets usw. Auf diese Weise, wenn der Benutzer ist kein Zugriff erlaubt, es wird nur eine leere Ergebnismenge zurückgegeben. Es ist unmöglich, dass die Daten zurückgegeben werden, und die leere Ergebnismenge sollte Ihrer Seite mitteilen, dass das Element nicht existiert (nicht unbedingt ein Autorisierungsfehler, nur dass das Objekt nicht existiert).

Drittens sollten alle Seiten, die inhärent über den Benutzer sind, wie z. B. ein Benutzerprofil, eine Kontoseite oder ein Dashboard, in der URL niemals eine ID haben, sondern nur automatisch zur Seite der authentifizierten Benutzer.

Wenn Sie schließlich verhindern müssen, dass der Benutzer auf eine ganze Seite oder einen Seitensatz zugreift, sollten Sie dies im OnAuthorization-Ereignis oder einem ähnlichen Ereignis (benutzerdefiniertes Attribut, Basisklasse usw.) oder mithilfe der integrierten in der Attributautorisierung und verwenden Sie die rollenbasierte Autorisierung. Führen Sie niemals Autorisierung im PageLoad oder einem ähnlichen Ereignis durch (z. B. die Controller-Aktion), da bis zu diesem Zeitpunkt bereits viel Arbeit in der Pipeline passiert ist. Es ist am besten, den Zugriff lange vor dem Einrichten der Seite zu blockieren. Autorisierungsereignisse geschehen am Anfang der Pipeline.

+0

Prost, erstellt eine Verknüpfung mit dem Benutzer Tabelle und das löste das Problem in einer einfach zu implementieren. Ich werde das benutzerdefinierte Attribut für die weitere Entwicklung untersuchen, aber für den Moment funktioniert das gut. –

0

eine Aktion Stellen, die userId überprüfen und Fehlerseite zurückgibt oder

public FileResult Image(string imageName) 
{ 
    string UserId = MethodWhereYouGetCurrentUserID(); 
    if(imageName == null) return View("~/Views/Shared/Error.cshtml", (object)"Null image"); 
    string imageShortName = imageName.Split(".")[0]; 
    if(!UserId == imageShortName) return View(~/Views/Shared/Error.cshtml, (object)"You can't access to this"); 
    string path = Server.MapPath("~/Contant/images/"+imageName); 
    return File(path, "image/jpg"); 
} 

RouteConfig

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute 
    (
    name: "ImageRoute", 
    url: "/images/imageName", 
    default: new {controller = "Home", action = "GetImage"} 
); 
} 
Verwandte Themen