Ho un controller in cui sto inserendo un'interfaccia di servizio nel costruttore. Il servizio ha anche interfacce iniettate nel suo costruttore. Il contenitore IoC (Unity) deve utilizzare le informazioni sull'utente durante la costruzione di una delle classi restituite per una determinata interfaccia.ASP.NET MVC Autentica prima del controller istanziato
Quello che sta accadendo è che il controllore viene istanziato prima che l'attributo [Autorizza] sia valutato e l'utente sia autenticato. Questo impone Unity per eseguire l'iniezione della dipendenza e utilizzare le informazioni sull'utente prima che abbiano effettuato l'accesso. Nessuno di questi era un problema quando stavamo usando l'autenticazione integrata di Windows, ma ora stiamo usando OpenID Connect in Azure AD e le informazioni dell'utente non sono fino a quando non si collegano (ciò accade dopo che il controller è stato istallato).
Ho sentito (in altri post) che esiste un modo per configurare la mia classe di avvio di Owin per spostare l'autenticazione in precedenza nel processo, ma non riesco a trovare alcun esempio su come farlo. Ho bisogno che l'autenticazione avvenga prima che il controller venga istanziato.
Ecco un esempio semplificato di ciò che ho ...
Controller:
[Authorize]
public class MyController : Controller
{
private readonly IMyService myService;
public MyController(IMyService myService)
{
this.myService = myService;
}
// ...
}
configurazione di Unity:
public class UnityBootstrap : IUnityBootstrap
{
public IUnityContainer Configure(IUnityContainer container)
{
// ...
return container
.RegisterType<ISomeClass, SomeClass>()
.RegisterType<IMyService>(new InjectionFactory(c =>
{
// gather info about the user here
// e.g.
var currentUser = c.Resolve<IPrincipal>();
var staff = c.Resolve<IStaffRepository>().GetBySamAccountName(currentUser.Identity.Name);
return new MyService(staff);
}));
}
}
OWIN avvio (Startup.Auth.cs):
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = this.clientID,
Authority = this.authority,
PostLogoutRedirectUri = this.postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = context =>
{
context.ProtocolMessage.DomainHint = this.domainHint;
return Task.FromResult(0);
},
AuthorizationCodeReceived = context =>
{
var code = context.Code;
var credential = new ClientCredential(this.clientID, this.appKey.Key);
var userObjectID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
var authContext = new AuthenticationContext(this.authority, new NaiveSessionCache(userObjectID));
var result = authContext.AcquireTokenByAuthorizationCode(code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, this.graphUrl);
AzureAdGraphAuthenticationHelper.Token = result.AccessToken;
return Task.FromResult(0);
}
}
});
}
ho inciampato su questo troppo, anche se senza alcuna delle cose DI. Necessario un ID utente nel costruttore del controller di base, e fu sorpreso di vedere il costruttore chiamato prima che'AuthorizedOttribute avesse spostato l'utente. –
Una spiegazione del perché è così http://stackoverflow.com/a/4462767/10245 –