web-dev-qa-db-fra.com

Comment suis-je censé utiliser ReturnUrl = ViewBag.ReturnUrl dans MVC 4

Je travaille sur l'application 'ASP.NET MVC 4'. J'utilise/j'apprends SimpleMembershipProvider et j'essaie de m'en tenir à la logique par défaut créée par VS2012 avec le Internet template _ (si je ne me trompe pas, celui avec 'SimpleMembershipProvider' prêt à l'emploi).

Je suis coincé au AccountController où je ne peux pas comprendre comment exactement je peux utiliser cette méthode:

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

D'après ce que j'ai compris, l'idée est de se rediriger vers l'emplacement à partir duquel vous avez décidé de vous connecter (exactement ce que je veux accomplir). J'ai regardé comment il est utilisé dans la vue:

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

Cherchez un endroit où en fait ViewBag.ReturnUrl est défini avec une valeur et je n’ai que cette méthode ici:

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

et je suis assez confus sur comment exactement je suis censé obtenir l'emplacement/url. J'ai défini des points d'arrêt et je n'ai jamais vu returnUrl être quelque chose de différent de null, ce qui dans ce scénario me semble assez logique car il n'a aucune valeur (sauf si quelque chose me manque, bien sûr). ).

Donc, je ne peux vraiment pas comprendre comment cela fonctionne. Je poste ce qui précède juste pour montrer que j’ai essayé de faire mes devoirs, j’ai mené une enquête aussi loin que possible mais je n’ai pas trouvé de réponse, alors je pose la question ici. Pourriez-vous fournir une explication/un exemple sur la façon dont cela fonctionne réellement?

39
Leron

Lorsque vous utilisez l'authentification par formulaires et que l'utilisateur n'est pas authentifié ou autorisé, le pipeline de sécurité ASP.NET sera redirigé vers la page de connexion et passera en tant que paramètre dans la chaîne de requête le returnUrl égal à la page qui a été redirigé vers le page de connexion. L'action de connexion récupère la valeur de ce paramètre et la place dans le ViewBag afin qu'il puisse être transmis à la vue.

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

La vue enregistre ensuite cette valeur sous la forme indiquée par cette ligne de code dans la vue.

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

La raison pour laquelle il est stocké dans la vue est telle que, lorsque l'utilisateur effectue une soumission après avoir entré son nom d'utilisateur et son mot de passe, l'action du contrôleur qui gère la publication en retour aura accès à cette valeur.

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

Si l'état du modèle est valide et qu'ils sont authentifiés en appelant la méthode WebSecurity.Login, il appelle la méthode RedirectToLocal avec la valeur returnUrl qui provient de la vue, qui provenait à l'origine de l'action de connexion qui a créé la vue.

La valeur returnUrl sera nulle si l'utilisateur n'est pas redirigé vers la page de connexion, comme c'est le cas lorsqu'il clique simplement sur le lien de connexion en haut de la page dans la présentation par défaut. Dans ce cas, l'utilisateur sera redirigé vers la page d'accueil une fois la connexion établie. L’objet entier de returnUrl est de renvoyer automatiquement l’utilisateur à la page à laquelle il tentait d’accéder avant son authentification/autorisation.

62
Kevin Junghans

En effet, le modèle ASP.NET MVC par défaut utilise authentification par formulaire , et les contrôleurs sont décorés avec [Authorize] attribut:

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

[Authorize]
public class AccountController : Controller
{
    //...
}

Cela signifie que si l'utilisateur n'est pas authentifié, il sera redirigé vers la page de connexion définie dans l'attribut LoginUrl de l'élément forms.

Lors de la redirection, FormsAuthentication qui est un HttpModule ajoutera automatiquement l’URL demandée dans la chaîne de requête.

Donc, si vous accédez à /Account/Login, vous n’obtiendrez rien dans la requête car elle est décorée avec [AllowAnonymous] attribut. Mais si vous naviguez vers /Account/Manage vous remarquerez que returnUrl dans la chaîne de requête devient /Account/Manage(/Account/Login?ReturnUrl=%2fAccount%2fManage)

Donc, vous ne définissez pas returnUrl, le framework le fait pour vous, il vous suffit de l’utiliser dans le AccountController pour savoir où rediriger l’utilisateur après son authentification.

12
Davor Zlotrg

Lorsqu'un utilisateur non authentifié tente d'accéder à une section de votre application nécessitant une authentification, alors returnUrl apparaît. L'URL demandée par l'utilisateur non authentifié est essentiellement stockée dans returnUrl.

Vous pouvez consulter le tutoriel PluralSight: Construction d'applications avec ASP.NET MVC 4

4
Aritra B