Ho un front-end Web che chiama un backend ASP Web Api 2. L'autenticazione è gestita con ASP Identity. Per alcuni dei controller che sto creando, devo conoscere l'utente che sta effettuando la chiamata. Non voglio dover creare un modello strano da includere nell'identità dell'utente (che non memorizzo nemmeno nel client).Come ottenere il contesto dell'utente durante le chiamate Web Api?
Tutte le chiamate all'API sono autorizzate utilizzando un token al portatore, il mio pensiero è che il controller dovrebbe essere in grado di determinare il contesto dell'utente in base a questo, ma non so come implementarlo. Ho cercato ma non so cosa sto cercando esattamente e non ho trovato nulla di rilevante. Vado a fare una cosa del genere ...
public async Task<IHttpActionResult> Post(ApplicationIdentity identity, WalkthroughModel data)
Aggiornamento
ho trovato il sotto che sembrava molto promettente ... ma il valore è sempre nullo! Il mio controller eredita da ApiController e ha un'intestazione Autorizza.
var userid = User.Identity.GetUserId();
Update 2
Ho anche provato tutte le soluzioni in Get the current user, within an ApiController action, without passing the userID as a parameter ma nessuna funziona. Non importa quello che sto ottenendo un'identità che è valido e auth'd, ma ha un ID utente nullo
Update 3
Ecco dove sono a ora.
[Authorize]
[Route("Email")]
public async Task<IHttpActionResult> Get()
{
var testa = User.Identity.GetType();
var testb = User.Identity.GetUserId();
var testc = User.Identity.AuthenticationType;
var testd = User.Identity.IsAuthenticated;
return Ok();
}
testa = Name: ClaimsIdentity, testb = null, testc = Bearer, testd = true
utente è autenticato, ovviamente, ma sono in grado di recuperare la loro userID.
Update 4
ho trovato una risposta, ma sono davvero infelice con esso ...
ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
string username = identity.Claims.First().Value;
Questo mi fa il nome utente, senza alcuna chiamata db ma sembra molto janky e un dolore da sostenere in futuro. Mi piacerebbe se qualcuno avesse una risposta migliore.
Cosa devo fare se è necessario modificare le richieste inoltrate lungo la strada? Inoltre, ogni volta che ho effettivamente bisogno dell'ID dell'utente devo effettuare una chiamata db per convertire il nome utente nell'ID
Così, quando si emette la richiesta perché non aggiungere uno per il nome utente? È inoltre possibile definire i propri metodi di estensione su ClaimsIdentity. – Casey
@emodendroket Sembra una buona idea, ma non ho idea di come farlo. Sono piuttosto debole nei confronti dei membri, quindi sto lavorando su modelli/tutorial trovati online. Non esprimo esplicitamente un reclamo con il nome utente ma a quanto pare succede da qualche parte nel mio codice: - \ Grazie per il suggerimento Proverò a risolvere quello –
@emodendroket Allo stesso tempo ... secondo tutte le mie ricerche User.Identity.GetUserId(); dovrebbe * funzionare e non lo è! Voglio capire perché non funziona e risolverlo nel modo giusto, o se non altro comprenderlo e implementare una soluzione alternativa. –