2016-02-03 1 views
7

Sto scrivendo un'applicazione Intranet. Il framework di destinazione in project.json è dnx451. Questo è il mio comando di pubblicazione:ASP.NET CORE 1.0, Impersonation

dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1-update1 --no-source 

Database stringa di connessione:

Server=name;Database=name;Trusted_Connection=True; 

sto cercando di rappresentare l'accesso al database, ma non sta funzionando. Quando avvio l'applicazione, il mio utente Windows viene riconosciuto e dice Hello, Domain \ Username in alto a destra. Non appena provo ad accedere al database, viene visualizzato l'errore "Accesso non riuscito per l'utente Dominio \ NomeComputer". Se eseguo il pool di applicazioni sotto il mio utente, tutto funziona correttamente.

IIS: .NET CLR Versio è v4.0, Modalità pipeline gestita classica e Identità è ApplicationPoolIdentity. Autenticazioni del sito Web: la rappresentazione di ASP.NET e l'autenticazione di Windows sono abilitate.

Che cosa è necessario modificare che la rappresentazione ha finalmente funzionato?

risposta

7

Il core non supporta la rappresentazione perché tutto il codice web non è operativo, ospitato da Kestrel. Se vuoi farlo, devi prendere l'attuale Principal, come WindowsPrincipal, quindi manually impersonate nel punto in cui ti serve.

Una cosa da notare è che in RC1 non si ottiene WindowsPrincipal, quindi non è possibile farlo ora. Verrà risolto in RC2.

+0

la soluzione di blowdart funzionerà, l'ho appena testata contro RC1. Ho usato una versione aggiornata di questa versione 4.5.1: http://impersonation.codeplex.com/ che credo provenga dallo stesso esempio MSDN che è stato utilizzato per un po '. –

+0

@blowdart: è ancora core anche se obiettivo solo dnx-clr? – Dani

+0

Sì, è ancora core – blowdart

7

Se si desidera che ogni richiesta di pagina impersonifichi l'utente, è possibile configurare il proprio Middleware da eseguire prima di MVC;

public class Impersonate 
{ 
    private readonly RequestDelegate next; 
    public Impersonate(RequestDelegate next) { 
     this.next = next; 
    } 
    public async Task Invoke(HttpContext context) { 
     var winIdent = context.User.Identity as WindowsIdentity; 
     if (winIdent == null) { 
      await next.Invoke(context); 
     }else { 
      WindowsIdentity.RunImpersonated(winIdent.AccessToken,() => { 
       next.Invoke(context).Wait(); 
      }); 
     } 
    } 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { 
    .... 
    app.UseMiddleware<Impersonate>(); 
    app.UseMvc(...); 
    ... 
} 
+1

che il codice fallisce magnificamente con il nuovissimo nucleo stabile mvc = ( –

+1

scuse, ho erroneamente cercato di invocare il gestore successivo in modo asincrono, il che significava che la rappresentazione probabilmente si applicava solo alla prima chiamata I/O attesa. Restituito, RunImpersonated restituirebbe e aspetteremo il resto della pipeline Web. Invece la rappresentazione deve bloccare il thread di richiesta fino al completamento del successivo delegato (come modificato in precedenza?). Sebbene possa ancora essere presente il codice asincrono che viene eseguito su un thread diverso ... –

Problemi correlati