Dove archiviare i token di accesso e aggiornamento sull'app Web del client ASP.NET - chiamando un'API REST

17

Ho creato un'API Web in ASP.NET che funge da punto di ingresso in un database SQL Server per i dati del report. Questo servizio ha un endpoint "token" che autentica un utente tramite l'identità ASP e restituisce un accesso di 20 minuti e un token di aggiornamento di 2 settimane.

Questa API dovrebbe essere accessibile solo tramite le nostre app e i nostri prodotti. Scriveremo un'app per Android, un'app per iOS e un'applicazione web ASP.NET che eseguirà l'autenticazione e otterrà i dati da questa API Web sopra descritta. Sarò responsabile per l'applicazione Web del client ASP.NET e l'API. Stiamo costruendo queste app tutte internamente affinché i nostri clienti possano accedere e utilizzare. Nessuna terza parte al di fuori della mia azienda chiamerà la nostra API attraverso una qualsiasi delle proprie app.

Per la mia app web ASP.NET del mio cliente, la sto scrivendo in ASP.NET MVC e in realtà non ha un database sin da quando comunica con l'API per tutto.

Ho iniziato con questo come base e funziona ... ma ora ho bisogno di convertire questo file HTML in un'app Web ASP.NET in MVC e capire dove e come conservare il token di accesso e aggiornare gettoni. link /

Le mie domande sono:

  1. Capisco che dovrò passare il token di accesso nelle chiamate successive all'API per eseguire operazioni CRUD. Dove devo fare la mia richiesta web per autenticare l'utente sull'app Web al momento dell'accesso ... dal codice C # dietro o JavaScript come nell'esercitazione di cui sopra? Chiedo perché mi rendo conto che ho bisogno del token di accesso nelle mie chiamate JS Ajax, ma ho sentito che il token di aggiornamento deve essere più "sicuro" e chiamare dal codice server potrebbe darmi opzioni più sicure per farlo ??

  2. Dove posso archiviare il token di accesso? In un cookie creato in JavaScript o nel server? Nella memoria locale JavaScript? In una variabile di sessione che posso passare allo JavaScript forse?

  3. Dove posso conservare il token di aggiornamento? Avrò bisogno di questo per rinnovare il token di accesso prima che stia per scadere. Ho cercato su Google fino alla morte, ma non riesco a trovare una buona soluzione ASP.NET online che mi indichi dove o come archiviarla dal punto di vista della mia web application. Un cookie creato dal server, salvato in un DB SQL che l'app Web utilizza, in una variabile di sessione?

Ho un disperato bisogno di aiuto, e questo mi sta facendo impazzire e mi tiene sveglio la notte. Spero che qualcuno possa fornire un esempio completo e semplice e descrivere completamente ciò che devo fare.

    
posta Andy DesRosiers 18.09.2015 - 19:09
fonte

1 risposta

10

1. Dove autenticare l'utente?

Se è un utente che deve autenticarsi, allora hai bisogno di qualcosa nel tuo front-end. Dal tuo front-end, puoi semplicemente fare un POST al tuo back-end, con le credenziali dell'utente. Si verificano le credenziali dell'utente e si emette una coppia accesstoken / refreshtoken nel caso in cui le credenziali siano note. Dovrai SEMPRE passare attraverso il back-end per autenticare un utente. Hai detto che il tutorial lo fa in JS, ma non lo fa. PUNTA su un modulo di accesso. Il POST viene avviato in JS, ma va al back-end.

2. Dove immagazzino il token di accesso?

Il token di accesso può essere memorizzato nello stesso modo in cui sono memorizzati i normali cookie di autenticazione. Hai varie opzioni (cookie solo http sicuri, localstorage, archiviazione di sessioni, ecc.). Nello scenario più semplice, è sufficiente archiviarlo in un cookie in modo che venga inviato insieme a ciascuna richiesta. Tuttavia, per un'app mobile, è probabilmente più semplice memorizzarla in LocalStorage.

3. Dove immagazzino il refreshtoken?

Questo dipende molto dalla tua applicazione. I hanno chiesto la stessa domanda qualche tempo fa, per le app mobili (assicurati di leggi anche i commenti). È necessario memorizzare il refreshtoken in un luogo sicuro. Per le app che svilupperai, puoi seguire i suggerimenti della risposta a cui mi sono collegato, ovvero:

  • Salva il refreshtoken in LocalStorage
  • Archivia il refreshtoken crittografato da qualche parte sul file system, utilizzando un'API fornita da Android / IOS. Memorizzare la chiave di crittografia in localstorage. (o viceversa).

Per altri tipi di app, esistono altre possibilità. Memorizzare sia il token di accesso che il token di aggiornamento in LocalStorage potrebbe sembrare sbagliato da un punto di vista della sicurezza, ma un utente malintenzionato probabilmente avrà più fortuna nel intercettare il token quando è in transito, piuttosto che accedere alla pagina locale. Altri suggerimenti, a volte più esotici, sono forniti here (ad es. Storage IOS sicuro).

Informazioni aggiuntive

  • Personalmente mi piace questa serie di blog molto. Essere consapevoli, potrebbero iniziare a diventare un po 'obsolete, ma contengono una grande quantità di informazioni riguardanti un set-up REST-OWIN.
  • Si prega di non dimenticare di implementare tutti gli altri controlli di sicurezza, che non ho menzionato in quanto ciò avrebbe offuscato la risposta. HTTPS, cookie solo http, cookie protetti, prevenzioni XSS, ecc. Dovrebbero essere implementati, o il tuo token verrà rubato molto più velocemente del tempo necessario per leggere questa risposta.
risposta data 21.09.2015 - 20:59
fonte

Leggi altre domande sui tag