2017-11-05 8 views
2

Mein Ziel ist es, Benutzer nur dann zu autorisieren, wenn die customerId des aktuellen angemeldeten Benutzers mit der customerId auf der URL/dem Controller übereinstimmt.autorisieren angemeldeten Benutzer gegen URL

Ich benutze ASP.NET Core 2.0 mit Entity Framework. Ich habe ApplicationUser mit einer CustomerId-Int erweitert, die eine FK in einer CustomerIdentity-Tabelle hat.

Ich kann den customerId von der angemeldete Benutzer abzurufen, mit dieser Methode hier:

routes.MapRoute(
      name: "customers", 
      template: "{customerId?}/{controller=Home}/{action=Index}/{id?}"); 

Und dann ein customerId Parameter Ich habe in meinem Controller: http://rion.io/2016/01/04/accessing-identity-info-using-dependency-injection-in-net-5/

ich eine Routing gemacht haben .

Globale Admins haben das Recht, jeden Kunden zu verwenden, wie sie möchten, aber für alle anderen können sie nur ihre customerId verwenden, die zu ihrem angemeldeten Benutzer gehört.

Ich dachte an this Ansatz zu überprüfen, ob customerId von URL, z./23/Computer/Genehmigen entspricht currentCustomerId

Aber ich bin mir nicht sicher, wie man es an eine Richtlinie anpassen und behaupten, dass asp.net Kern verwendet.

Was ich sofar haben:

public class CustomerRequirement : IAuthorizationRequirement 
{ 
    public bool IsMatchingLoggedInUser { get; private set; } 

    public CustomerRequirement(bool isMatchingLoggedInUser) 
    { 
     IsMatchingLoggedInUser = IsMatchingLoggedInUser; 
    } 
} 

nicht sicher, wie dies zu machen:

public class CustomerRequirementHandler : AuthorizationHandler<CustomerRequirement> 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomerRequirement requirement) 
    { 
     //GetDate.CurrentCustomerId is a static int property set after user has logged in 
     if (GetData.CurrentCustomerId == /*Get httpContext customerId ??? "")*/ 42) 
     { 
      context.Succeed(requirement); 
     } 


     return Task.CompletedTask; 
    } 
} 

nicht sicher, ob ich völlig weg bin hier, oder es kann anders gemacht werden? Ich bin offen für Vorschläge.

aktualisieren

public class ValidateCustomerAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
      if (GetData.CurrentCustomerId != (int)context.ActionArguments["customerId"]) 
      { 
       context.Result = new UnauthorizedResult(); 
      } 
     } 
    } 

ich es mit diesem Attribut versehen Dann auf meinem Controller (was ich mit endete). Ich muss Admins immer noch ausschließen, aber das wird später kommen. (und einige weitere Fehlerbehandlung :))

Antwort

1

Ich bin nicht vertraut mit, wie ASP.NET Core tut dies (ist AuthorizationHandler ähnlich einem Action-Filter?), aber das scheint wie etwas, das Sie mit Rollen umgehen können.

Ich habe einen benutzerdefinierten Auth-Aktionsfilter, wo ich benutzerdefinierte Validierungslogik wie folgt setzen kann. Im Controller können Sie die Rollen des angemeldeten Benutzers überprüfen. Wenn sie nicht die Rolle "Admin" haben und ihre Kundennummer nicht mit der Kundennummer in der URL übereinstimmt, geben Sie eine 403 zurück. Andernfalls fahren Sie wie gewohnt fort.

Wenn der Wert der Kundennummer ein Problem für Sie ist und Sie keinen Zugriff auf die Aktionsparameter haben, können Sie den Uri der aktuellen Anforderung verwenden, den Pfad aufteilen und auf diese Weise herausziehen. Aber das ist eine fragile Implementierung.

+0

Das ist mein Ziel ja, in mvc5 könnte ich ein benutzerdefiniertes Attribut mit benutzerdefinierter Logik erstellen, aber hier muss ich einen Handler verwenden, wo ich nicht scheinen kann, in httpcontext oder anderen Sachen zu übergeben. Vielleicht fehlt mir nur das Wissen darüber, wie Custom-Handler agieren sollen. –

+0

Ok scheint wie Action-Filter sind noch im Kern verfügbar, also werde ich diesen Ansatz versuchen. Ich dachte auch darüber nach, eine benutzerdefinierte Routing-Einschränkung zu machen, so dass die ID in der URL zu einem angemeldeten Benutzer gehören muss, es sei denn, es war ein Administrator, aber könnte kompliziert sein, weil ich sicherstellen muss, dass der Benutzer angemeldet ist usw. –

+0

Ok ich habe die Actionfilter benutzt, und es funktioniert gut. Also danke für die Hilfe. Ich habe über die Frage mit dem, was ich umgesetzt habe, geantwortet. Fühlen Sie sich frei, es zu kommentieren. –

Verwandte Themen