9

Ho un progetto API Web che fornisce l'accesso solo agli utenti autorizzati in base ai ruoli. Prevediamo di ridimensionare a più progetti API simili nel prossimo futuro che utilizzeranno lo stesso token di autorizzazione. Quello che sto facendo è utilizzare un progetto separato che autentica l'utente (usando Facebook, Google o ActiveDirectory o qualsiasi altro provider di autenticazione) e quindi genera un token di autorizzazione che viene utilizzato da tutti i server API. Per abilitare la decodifica del token, sto condividendo la chiave della macchina tramite web.config tra tutte le applicazioni. Funziona bene Ora vorrei cambiare MachineKey ogni tanto e condividerlo tra tutte le applicazioni che utilizzano il token di autorizzazione.Autorizza WebAPI su più macchine utilizzando un SSO tramite il codice

  1. Come aggiornare la tastiera in fase di esecuzione tra tutte le applicazioni ?
  2. Esiste un modo programmatico per ottenere lo stesso?
  3. Ho letto in un blog che l'aggiornamento di machineKey non è una buona pratica. In tal caso, come evitare di utilizzare il codice macchina e creare un sistema in cui le chiavi non sono statiche?

La mia idea è di separare il progetto di autorizzazione dai miei progetti WebAPI in modo da non implementare e il sistema di autenticazione in tutti i progetti WebAPI. Qualsiasi suggerimento sarebbe molto utile.

risposta

4

Extended the implementation visualizzato sulla seguente risposta StackOverflow per soddisfare le proprie esigenze. Aggiornerò il codice tra un paio di giorni su come è possibile ottenere questo.

+0

Grazie, questo sembra un vantaggio promettente! – Shouvik

0

È possibile consentire alle API di richiedere il servizio di autorizzazione per confermare il token dal client e in quella stessa richiesta ottenere i dati ID dal servizio all'API. Per ridurre il traffico verso il servizio Auth, potrebbe distribuire token di accesso di breve durata alle API con una data di scadenza, che deve essere aggiornata dopo pochi minuti, o se sono critici, potrebbe essere revocata direttamente dal Servizio di autenticazione che richiama le API.

Il sistema suona molto simile a uno schema OAuth. Non suggerirei di provare ad andare completamente a meno che non preveda altri casi d'uso come i dispositivi mobili, ecc. Accedendo ai tuoi servizi, ma puoi leggere come lo fanno e implementare ciò che sembra rilevante per le tue esigenze.

+0

ho considerato l'implementazione e ho già architettato la soluzione su linee simili. Il fatto è che sono interessato a utilizzare il sistema di autenticazione basato su Windows per gestire la mia autorizzazione. In questo modo posso usare l'attributo '[Authorize]' sulle web API senza molti cambiamenti ai miei progetti API. Attualmente sto condividendo il 'machineKey' del mio sistema di generazione di token con i progetti API. In questo modo, non è necessario verificare il token dal server di autorizzazione. Voglio solo cambiare la macchina in modo dinamico in modo che non sia statica. – Shouvik

0

Come suggerito da Rajesh, credo che quello che sto cercando sia un miglioramento insignificante del suo collegamento. Essenzialmente ho bisogno di creare una funzione che imposta la mia chiave nel metodo Protect.

private IDataProtector protector; 

public string Protect(AuthenticationTicket ticket) 
{ 
    protector = new AesDataProtectorProvider(functionGenerateKey()); 
    //functionGenerateKey is a function that generates a new key and informs 
    //the subscribers to avail new key 
    var ticketData = this.serializer.Serialize(ticket); 
    var protectedData = this.protector.Protect(ticketData); 
    var protectedString = this.encoder.Encode(protectedData); 
    return protectedString; 
} 

public SecureTokenFormatter(string key) 
{ 
    this.serializer = new TicketSerializer(); 
    //this.protector = new AesDataProtectorProvider(key); -> Remove the initialization of this protector as I am doing it in the above function. 
    this.encoder = TextEncodings.Base64Url; 
} 

Il resto l'implementazione è abbastanza standard nel codice scritto da Barguast