risposta

30

Se si crea un progetto di applicazione Internet ASP.NET MVC 3 o 4, verrà fornito un esempio completo di come utilizzare l'URL di ritorno durante l'autenticazione.

Quando si aggiunge AuthorizeAttribute a un controller per forzare l'autenticazione, reindirizzerà l'utente al metodo di accesso e aggiungerà automaticamente il parametro returnUrl. Da lì, è necessario tenere traccia di come si mostra il tuo form di login:

public ActionResult Login(string returnUrl) 
{ 
    ViewBag.ReturnUrl = returnUrl; 
    return View(); 
} 

e poi aggiungerlo alla collezione percorso del proprio form di login:

@*//ReSharper disable RedundantAnonymousTypePropertyName*@ 
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) { 
@*//ReSharper restore RedundantAnonymousTypePropertyName*@ 

} 

Una volta che l'utente invia il login, assumendo si autenticano correttamente, ti basta reindirizzare a ReturnURL:

[HttpPost] 
public ActionResult Login(LoginModel model, string returnUrl) 
{ 
    return RedirectToLocal(returnUrl); 
} 

la parte più difficile è tenere traccia del ReturnUrl attraverso la sequenza GET/POST.

Se si desidera vedere come funziona AuthorizeAttribute, il post this StackOverflow mostra l'impostazione returnUrl con la richiesta originale.

È inoltre necessario verificare che returnUrl sia realmente un URL locale o che si risulti vulnerabile agli attacchi di reindirizzamento aperti. RedirectToLocal() è un metodo di supporto dal modello di applicazione 4 Internet MVC che fa questo di convalida:

private ActionResult RedirectToLocal(string returnUrl) 
{ 
    if (Url.IsLocalUrl(returnUrl)) 
    { 
      return Redirect(returnUrl); 
    } 
    else 
    { 
      return RedirectToAction("Index", "Home"); 
    } 
} 
+0

ringrazio molto, è ora di lavoro :) –

+2

@HediNaily: un punto per ricordare non è fidarsi ReturnURL ea controllalo prima di usarlo per reindirizzare l'utente –

+2

@ mohsen.d. RedirectToLocal() è un helper MVC 4 incluso nel modello di applicazione Internet che convalida l'URL prima del reindirizzamento. Lo aggiungerò alla risposta per quelli senza il metodo di supporto. – mfanto

Problemi correlati