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 :))
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. –
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. –
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. –