Sto usando Autofac per un'inversione del contenitore di controlli che si configura come questoPerché l'identità non caricato durante la risoluzione WebAPI ma è quando si risolve controller MVC
public void Configuration(IAppBuilder app) {
configureIoC(app);
configureAuth(app);
}
void configureIoC(IAppBuilder app) {
var b = new ContainerBuilder();
//...
b.Register(c => HttpContext.Current?.User?.Identity
?? new NullIdentity()).InstancePerLifetimeScope();
var container = b.Build();
app.UseAutofacMiddleware(container);
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
Credo che il fatto che questo è Autofac contro alcuni l'altro contenitore è probabilmente irrilevante per quello che sto vedendo. La linea chiave qui è quella che configura qualsiasi dipendenza su IIdentity
da prelevare da HttpContext.Current
.
Lo uso in questo modo in modo da poter avere accesso stub-in-user all'utente corrente ovunque io voglia.
public interface ICurrentUser {
Task<AppUser> Get();
}
public class CurrentUserProvider : ICurrentUser {
public async Task<AppUser> Get() => await users.FindByNameAsync(currentLogin.GetUserId());
public CurrentUserProvider(AppUserManager users, IIdentity currentLogin) {
this.users = users;
this.currentLogin = currentLogin;
}
}
Ho usato questo modello su progetti passati e funziona benissimo. Attualmente lo sto applicando a un progetto esistente e vedo una cosa molto strana.
- Quando un controlloreAsp.net Mvc dipende
ICurrentUser
tutto funziona bene - Quando un controlloreWebAPI ottiene un'istanza
ICurrentUser
dell'operazioneGet
fallisce poiché l'istanza diIIdentity
non è stato analizzato dal cookie e non ha ancora crediti caricati in esso (AuthenticationType == null
)! Stranamente, se metto in pausa il debugger dopo che il controller WebApi è stato istanziato, posso colpireHttpContext.Current.User.Identity
e vedere cheAuthenticationType == "Cookie"
e tutti i reclami ci sono.
Ciò mi porta a concludere è che in qualche modo le cose stanno accadendo nel seguente ordine
- Se questo è un percorso API Web, il controller Web Api crea un'istanza
- Asp.Net Identità compila la corrente
HttpContext
Identity - Se questo è un percorso MVC, il controller MVC crea un'istanza
- Eventuali azioni vengono eseguite
Questo ovviamente non ha alcun senso!
Quindi le domande sono le seguenti
- È la mia deduzione del l'ordine delle cose in cantiere corretta?
- Come posso controllarlo per funzionare correttamente? Perché questo avrebbe funzionato su altri progetti ma causando problemi qui? Sto collegando qualcosa nell'ordine sbagliato?
Si prega di non suggerire di creare un IdentityProvider
a risoluzione tardiva IIdentity
. Capisco come posso risolvere il problema, ciò che non capisco è il motivo per cui questo sta accadendo per cominciare e come controllare l'ordine delle tubature.
Sei sicuro che hai fatto si utilizza la stessa configurazione del CIO Sia ASP MVC e Web API? Per quanto riguarda il know, entrambi di loro usano diverse fabbriche per creare controller – tutok
@tutok vedere il carico di due linee del mio primo blocco di codice –
hai trovato a ICurrentUser da un WebAPI con un ritardo (presunto 500ms) e osservare la differenza (se ce ne sono)? – ymz