Sfondo
Ho un progetto Web API 2, senza alcuna estensione di ASP.NET MVC o progetti ASP.NET. L'API verrà utilizzata solo per comunicare tra il server e Windows 8, Windows Phone 8.1 e le applicazioni iOS. Nessun sito web consumerà l'API. L'API consente a un utente di gestire i prodotti in un magazzino. Un utente può aggiungere, rimuovere e controllare i prodotti nel database.
public class User
{
public int Id { get; set; }
[Required]
public string UserName { get; set; }
[Required]
public string DisplayName{ get; set; }
[Required]
public bool IsEnabled {get; set;}
}
Niente di speciale - solo un modello per Entitiy Framework. Ovviamente esiste anche un modello per il prodotto. Si noti, non ho bisogno di alcuna password dai miei utenti, dal momento che questo non è importante per la sicurezza dei dati. Gli utenti dell'API non si conosceranno mai gli altri UserName - solo gli altri DisplayName.
I problemi
Il problema riguarda la sicurezza nell'API Web. Non voglio esporre la mia API al mondo intero - solo le applicazioni. Quindi ho fatto molte ricerche e dalla ricerca ho il seguente scenario:
Scenario n. 1
Il modo migliore per garantire un elevato livello di sicurezza nella mia API è:
- Utilizza SSL
- Utilizza l'autenticazione basata su token dei client
- usa un token con una brevissima scadenza
- per non utilizzare l'identità ASP.NET
- per utilizzare i gestori dei messaggi invece dei filtri azione
- Aggiungi un campo UserToken al modello User e genera un token per ciascun utente
Scenario n. 2
Il modo migliore per garantire un elevato livello di sicurezza nella mia API è:
- usa SSL
- usa l'identità di ASP.NET per fare l'accesso a nome utente e password
- utilizza un approccio basato su token basato sull'autenticazione dell'identità ASP.NET
Domande
- Qual è l'approccio migliore? Scenario n. 1 o n. 2?
- In generale, qual è il modo migliore per proteggere un'API?
- Il modo migliore è uno dei miei scenari?
Non esitate ad aggiungere / rimuovere elementi dai due scenari, ma anche ad aggiungere nuovi e più sicuri scenari.