2016-05-04 5 views
0

I wie unter zwei Entitätsmengen haben:Wie erstellt man ein benutzerdefiniertes Attribut in ASP.NET MVC5?

public class Serial 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int SerialID { get; set; } 
     [HiddenInput(DisplayValue=false)] 
     public string Id { get; set; } 
     [Required(ErrorMessage="Please provide your membership serial")] 
     [StringLength(16,ErrorMessage="This field can't be longer as of 16 characters.")] 
     public string UserSerial { get; set; } 
    } 

UND

public class Subscription 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int SubscriptionID { get; set; } 
     [Required(ErrorMessage="Please provide a subscription code.")] 
     public string AdminSerial { get; set; } 
    } 

Ich möchte eine benutzerdefinierte Berechtigungs Attribut erstellen meine Aktionsmethoden in meinem Controller mit folgendem Szenario zu entwerfen:

Ich würde gerne überprüfen, ob der Wert UserSerial in Serial Entität ungleich AdminSerial in Subscription Entity. Wenn die obige Bedingung wahr wird, so sollte die ActionResult Methode selbst ausgeführt werden, sonst sollte die benutzerdefinierte AuthorizeAttribute es zu einer anderen Aktionsmethode umleiten, hier ist was ich versuchte, aber es funktioniert nicht bin ich etwas fehlt?

public class RequireSerial : AuthorizeAttribute 
    { 
     EFDbContext db = new EFDbContext(); 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 

      if (!db.Subscriptions.Any(s => s.AdminSerial.Equals(db.Serials.Any()))) 
      { 
       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Serials", action = "Create" })); 
      } 
      else 
      { 
       // Execute the Action method itself 
      } 
     } 
    } 

Ich habe versucht, diese RequireSerial Brauch zu setzen Attribut auf der Oberseite der Aktionsmethoden genehmigen, aber nichts geschieht wirklich.

[RequireSerial] 
     public ViewResult Checkout() 
     { 
      return View(); 
     } 

Jede Hilfe wäre willkommen.

Antwort

-1

Autorisierung ist im Grunde ein "boolean" -Wert (nicht genau ein wahrer Boolescher aber es gibt entweder eine Autorisierung oder einen Fehler davon) um es vollständig zu bekommen, MSDN's Artikel über ist sehr klar.

Custom Authorization

+0

Was dann zu tun ?! –

+0

Wenn Sie eine Klasse für die benutzerdefinierte Autorisierung erstellen, müssen Sie die IsAuthorized-Funktion überschreiben. –

0

Sie benötigen OnAuthorization eine HandleUnauthorizedRequest Methode außer Kraft zu setzen. HandleUnauthorizedRequest wird standardmäßig Implementierung der OnAuthorization Methode aufgerufen, wenn der Benutzer nicht berechtigt ist. Standard-Implementierung von HandleUnauthorizedRequestredirects die Benutzer-Login-Seite.

EFDbContext db = new EFDbContext(); 
public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    //handle base authorization logic 
    base.OnAuthorization(filterContext);  

    //if user is not authorized (by base rules) simply return because redirect was set in 'base.OnAuthorization' call.  
    if (this.AuthorizeCore(filterContext.HttpContext) == false) 
    { 
     return; 
    } 

    //Here comes your custom redirect logic: 
    if (!db.Subscriptions.Any(s => s.AdminSerial.Equals(db.Serials.Any()))) 
    { 
     filterContext.Result = your redirect url goes here; 
    }     
    }