2017-05-03 4 views
0

Ich habe einen Authentifizierungsfilter für meine API erstellt und validiert den Auth-Header, um sicherzustellen, dass der Benutzer auf die API zugreifen kann. Ich habe aber auch Berechtigungen auf Endpoints gesetzt, die es Benutzern erlauben, zu lesen, aber nicht zu schreiben usw. Ich möchte diese Authentifizierung hier durchführen können und wenn es fehlschlägt, kann ich die Anfrage beenden. Um dies zu tun, muss ich die Controller- und Action-Werte kennen. Ich habe Zugriff auf die URL-Zeichenfolge, aber ich zögere, dies selbst zu analysieren, es sei denn, ich muss.Zugriff auf Routeninformationen vom Authentifizierungsfilter in der ASP.NET-API

Ich habe versucht, aus dem folgenden Code innerhalb der AuthenticateAsync Methode

var requestcontext = context.Request.GetRequestContext(); 
string actionName = requestcontext.RouteData.Values["action"].ToString(); 
string controllerName = requestcontext.RouteData.Values["controller"].ToString(); 

Dies gibt ein Problem, da die Controller und Aktionstasten sind an dieser Stelle nicht festgelegt. Gibt es eine Möglichkeit, sie zu zwingen, sich festzulegen? Bedeutet, gibt es eine Methode, die ich aufrufen kann, die .NET zwingen wird, die Routendaten jetzt anstelle von später zu setzen, mir Zugang zu den Werten zu gewähren?

Für den Fall, dass dies nicht möglich ist. Wie könnte ich das erreichen? Ich habe versucht, einen Basis-APIController zu erstellen, und hier habe ich versucht, folgendes hinzuzufügen.

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
//check the route data and validate 
} 

Dies hat nicht funktioniert, da der APIController diese Methode nicht unterstützt. Angenommen seinen Teil des MVC-Controllers und nicht die API. Ich habe verschiedene andere Überschreibungen ausprobiert, die mit MVC funktionieren, aber sie funktionieren nicht für den API-Controller. Ich würde viel lieber in der Lage sein, alles im Filter zu behandeln, so dass ich keinen Controller verwenden muss, aber wenn dies der einzige Weg ist, es zu tun, wie kann es getan werden?

+1

Ich hatte das gleiche Problem haben, können Sie einige Antworten auf meine Frage finden: http://stackoverflow.com/questions/18248547/get-controller-and-action-name-from-within-controller – Robert

Antwort

0

Der folgende Code funktioniert, um die Aktions- und Controllerdaten während der Authentifizierung abzurufen.

public class MyCustomFilter : IAuthenticationFilter 
{ 
    public bool AllowMultiple { get; } 

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     string actionName = context.ActionContext.ActionDescriptor.ActionName; 
     string controllerName = context.ActionContext.ControllerContext.ControllerDescriptor.ControllerName; 
    } 
} 
Verwandte Themen