2016-07-24 5 views
0

Ich arbeite an einer Anwendung, die eine ApplicationFilter verwendet einige Controller-Aktionen zu sichern, wie folgt aus:Wie verwende ich anforderungsspezifische Informationen in der attributbasierten MVC-Autorisierung?

[MustLogInOrPay] 
public virtual ActionResult DownloadImage(int imageId) { 
... 
} 

So MustLogInOrPay erstreckt Action, und es leitet sie, wenn nötig, auf eine Seite, wo der Benutzer entweder Loggt sich ein oder zahlt und geht dann weiter, wohin sie gehen. Scheint gut zu funktionieren.

Ich möchte die Autorisierung intelligenter machen und einem Benutzer, der bezahlt hat, das gleiche Bild während seiner Sitzung unbegrenzt oft herunterladen, um die Chancen zu verringern, dass sie frustriert sind, wenn der erste Download fehlschlägt.

Leider ist der Code, der die Entscheidungen trifft, in MustLogInOrPay und die ImageId ist nicht verfügbar. Die einzigen zwei Möglichkeiten, die ich kenne, sind: 1) Habe MustLogInOrPays Code in die rohe Anfrage eingraviert, um die imageId zu finden, die yucky klingt, oder 2) Beginne DownloadImage mit dem Code, der sich momentan in MustLoginOrPay befindet, was im Wesentlichen das Attribut-basierte verursacht Mechanismus im Müll. Gibt es einen besseren Weg? Was ist die beste Vorgehensweise für die Verwendung anforderungsspezifischer Informationen in einem globalen Autorisierungsfilter?

+0

Der beste Ansatz für das für mich ist, um ein Feld zu AspNetUsers wie „bezahlt“ und fügte hinzu, und dann abrufen und überprüfen, wenn der Benutzer versucht, herunterzuladen. – Hadee

+0

@Hadee Wir speichern keine Benutzerdaten. Es gibt kein solches Konto. Am meisten speichern wir transiente Daten für die Sitzung. Das System implementiert keinen Mitgliedschaftsanbieter. –

+0

Aber Sie haben "MustLogInOrPay", was bedeutet, dass Sie "Login" haben !!!. Wie auch immer, du könntest auch TempData [""] verwenden. – Hadee

Antwort

0

Wenn Sie AuthorizeCore Methode überschreiben, sollten Sie Zugriff auf die imageId innerhalb des Genehmigungsfilter haben wie folgt:

public class MustLogInOrPay : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     string imageId= httpContext.Request.RequestContext.RouteData.Values["imageId"].ToString(); 
    } 
} 
Verwandte Themen