2014-09-14 24 views
5

Ho creato un'applicazione multi-tenant utilizzando Entity Framework, WebAPI, ASP.NET Identity. Fondamentalmente legge il sottodominio del tenant e lo utilizza per leggere la stringa di connessione dal database e impostarlo su runtime.Identità ASP.NET + token bearer + multi-tenant

Tutto è grande, il database sta creando ecc., Ma l'unico problema ora è il token di identità di ASP.NET.

Quando ho generato un token di accesso al portatore per http://tenant1.#####.com/token, sembra che il token sia firmato sulla stessa applicazione (nessuna chiave del computer è stata specificata) e consente l'accesso ai controller http://tenant2.#####.com, che non dovrebbe essere il caso in quanto è diversi sottodomini/inquilini.

Ci sono dei modi per aggirare questo problema? O forse dovrei cercare in altri Security Framework e non in ASP.NET Identity?

+0

È necessario assumere il controllo sui token e aggiungere lì dati personalizzati, il nome del tenant. Poiché i token sono basati su affermazioni, ciò dovrebbe essere possibile. Quindi verifica su ogni richiesta un altro controllo per verificare se l'attuale titolare corrisponde a quello del token. Ad esempio, questo controllo potrebbe essere eseguito in un modulo http personalizzato. –

+0

Salve, in questo scenario le rivendicazioni potrebbero essere un approccio "sicuro"? Perché tutto ciò che serve è la possibilità di spoofing di un token con il claim tenantid corretto e la richiesta può essere inoltrata? –

+0

Non è possibile eseguire lo spoofing di un token dal lato client. –

risposta

3

MVC5 semplifica l'aggiunta di una rivendicazione del nome del titolare all'identità dell'utente. nella cartella models, modificare la classe ApplicationUser in IdentityModels.cs:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
{ 
    // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 

    // Add claim for tenant name 
    userIdentity.AddClaim(new Claim("tenantName", "abcCompany"); 

    // Add custom user claims here 
    return userIdentity; 
} 

Poi, quando una richiesta autenticata viene elaborato, verificare che l'utente contiene corretta richiesta e valore.

+0

È possibile ottenere un esempio di come acquisire il nome del titolare nel punto in cui lo si aggiunge come reclamo? Attualmente sto esaminando questo, ma anche cercando di evitare di scavalcare tutto all'interno di SignInManager. –

+0

Sto facendo qualcosa di simile a come l'utente –

+0

Dipende dalla tua implementazione. Il nome del titolare può essere basato sul sottodominio della richiesta, un valore del cookie o potrebbe essere esplicitamente fornito dall'utente. Per quanto riguarda l'accesso al valore, sto utilizzando lo stesso schema utilizzato da ASP.NET per implementare IPrincipal e IIdentity. Internamente, IPrincipal ha un riferimento per richiesta all'utente corrente. –

Problemi correlati