2014-12-03 18 views
16

Quando si crea una nuova applicazione Web (Webform o mvc) in Visual Studio, esiste una logica post-autenticazione che controlla un parametro ReturnUrl nella stringa di query e quindi reindirizza l'utente lì se esiste: In weforms - Login.aspx.cs avete questo:perché il duplicato returnUrl reindirizza la logica nelle applicazioni Web asp.net con owin/identity?

protected void LogIn(object sender, EventArgs e) 
{ 
    ... 
     switch (result) 
     { 
      case SignInStatus.Success: 
       IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response); 
       break; 
      ... 
     } 
    } 
} 

in MVC - AccountController.cs avete questo:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    ... 
    switch (result) 
    { 
     case SignInStatus.Success: 
      return RedirectToLocal(returnUrl); 
     ... 
    } 
} 

Ora, in aggiunta, la configurazione Owin è configurato per utilizzare l'autenticazione di cookie, che utilizza il Classe Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler, che a sua volta che cks per un parametro ReturnUrl e applica un reindirizzamento se esiste:

protected override async Task ApplyResponseGrantAsync() 
{ 
    AuthenticationResponseGrant signin = Helper.LookupSignIn(Options.AuthenticationType); 
    bool shouldSignin = signin != null; 
    AuthenticationResponseRevoke signout = Helper.LookupSignOut(Options.AuthenticationType, Options.AuthenticationMode); 
    bool shouldSignout = signout != null; 

    if (shouldSignin || shouldSignout || _shouldRenew) 
    { 
     ... 

     if ((shouldLoginRedirect || shouldLogoutRedirect) && Response.StatusCode == 200) 
     { 
      IReadableStringCollection query = Request.Query; 
      string redirectUri = query.Get(Options.ReturnUrlParameter); 
      if (!string.IsNullOrWhiteSpace(redirectUri) 
       && IsHostRelative(redirectUri)) 
      { 
       var redirectContext = new CookieApplyRedirectContext(Context, Options, redirectUri); 
       Options.Provider.ApplyRedirect(redirectContext); 
      } 
     } 
    } 
} 

Entrambi i redirect appaiono per eseguire durante la richiesta di accesso/autenticazione. Uno è applicato a HttpContext.Response e l'altro è applicato al contesto di reindirizzamento di Owin. Nella mia esperienza, sembra che la seconda chiamata di reindirizzamento vince, il che è un problema se si ha una logica di reindirizzamento speciale applicata dopo il login nel codice del sito Web perché viene sovrascritta dal reindirizzamento Owin incorporato.

C'è una buona ragione per questa logica duplicata? È solo un design scadente? Quindi, se sto usando asp.net Owin CookieAuthentication, dovrei avere una logica di reindirizzamento post-login sul controller account o sul codice aspx? E se sì, il reindirizzamento dovrebbe essere applicato su HttpContext.Response o tramite Owin in qualche modo?

risposta

2

Come hai detto, questi tre modi per reindirizzare tutti appartengono a parti diverse: WebForms, MVC, OWIN. Ognuno di essi può essere utilizzato indipendentemente dall'altro (OWIN nella situazione di auto-hosting), quindi è necessario fare la stessa cosa in ognuno di essi.

Tuttavia, non sono del tutto sicuro del motivo per cui l'ultimo modello MVC necessita di RedirectToLocal. Vorrei andare con la compatibilità con le versioni precedenti - questo metodo è stato lì per anni.

Anche il reindirizzamento OWIN non vince in MVC: in una delle mie app, reindirizzo sempre l'utente in base al ruolo, anche se è presente un parametro con l'URL locale, i miei utenti finiscono sempre nella pagina specificato nel controller MVC.
Tuttavia, dopo aver osservato il codice sorgente OWIN e la logica di reindirizzamento, sembra strano che MVC vince. Probabilmente è necessario passare in rassegna tutto e vedere cosa succede nello scenario MVC.

+1

'RedirectToLocal' è un metodo di supporto che esegue il valore del parametro' returnUrl' tramite 'IsLocalUrl' per determinare se si tratta di un percorso relativo al sito corrente. Ciò impedisce il dirottamento del parametro 'returnUrl' per reindirizzare a un sito di terze parti. –

+0

@ChrisPratt Quasi la stessa logica sta accadendo nel metodo OWIN citato sopra – trailmax

Problemi correlati