TLDR;
Where and possibly how should I implement scope based logic in the example code?
Ho un API Web ASP.NET.
L'API utilizza OData (in cima al REST) per endpoint dati e autenticazione OAuth 2.0. Ora voglio aggiungere funzionalità per gestire un token di accesso in diversi ambiti.
Alcuni degli ambiti sono:
- utente
- Organizzazione
- Clienti
Il risultato impostato sui ritorni API dovrebbe essere basato su questo ambito. Lo stesso vale se qualcuno vuole aggiungere, aggiornare o eliminare un'entità.
Ora prendi ad esempio il seguente endpoint:
http://myapi/Employees
Qualcuno con un token nell'ambito Organizzazione fa un GET e dovrebbe solo ottenere i dipendenti che si trovano nell'organizzazione che è definita all'interno del token. Un utente nell'ambito Cliente dovrebbe ottenere i dipendenti per tutte le organizzazioni all'interno del cliente definito nel token. Questa funzionalità tuttavia non è disponibile per qualcuno con un token nell'ambito Utente.
Lo stesso vale per un POST. A qualcuno all'interno dello spazio dell'organizzazione dovrebbe essere consentito aggiungere un nuovo dipendente alla propria organizzazione.
La funzionalità per i diversi ambiti di solito differisce solo un po '. Nel caso di ottenere i dipendenti la differenza è solo un punto sull'organizzazione o altrimenti sul cliente. Nel caso di un post, dovrebbe essere un controllo per verificare se, per esempio, l'organizzazione è parte del cliente che è vincolato al token del cliente.
Implementazione corrente:
Attualmente abbiamo un ApiController di base che è tipizzato generico. Il controller di base chiama una Query o CommandHandler con il tipo di entità e tutti i dettagli di implementazione si trovano all'interno di questi gestori.
ApiController
public abstract class ApiController<TEntity> : EntitySetController<TEntity, Guid>
where TEntity : class, IApiEntity
{
protected readonly IQueryProcessor QueryProcessor;
protected readonly ICommandProcessor CommandProcessor;
protected ApiController(IQueryProcessor queryProcessor, ICommandProcessor commandProcessor)
{
this.QueryProcessor = queryProcessor;
this.CommandProcessor = commandProcessor;
}
[HttpGet]
public override IQueryable<TEntity> Get()
{
var command = new GetEntityCommand<TEntity>();
return this.QueryProcessor.Process(command);
}
}
EmployeeController
public class EmployeeController : ApiController<Employee>
{ }
GetEmployeeHandler
public class GetEmployeeCommandHandler : IQueryHandler<GetEntityCommand<Employee>, IQueryable<Employee>>
{
public IQueryable<Employee> Handle(GetEntityCommand<Employee> command)
{
// Code that knows how to get a collection of employees.
// This collection contains all employees
}
}
PostEmployeeHandler
public class PostEmployeeCommandHandler : ICommandHandler<PostEntityCommand<Employee>, Employee>
{
public Employee Handle(PostEntityCommand<Employee> command)
{
// Code that knows how to add an employee to the database.
}
}
La domanda
Dove e possibilmente come dovrei implementare la logica basata sull'oscilloscopio? So che ci deve essere un modo intelligente per farlo e un buon posto per implementare questa logica basata sull'oscillazione, io proprio non la vedo (ancora).