Comment suis-je censé utiliser ReturnUrl = ViewBag.ReturnUrl MVC 4
Je suis en train de travailler sur "l'ASP.NET MVC 4' application. Je suis à l'aide de/l'apprentissage SimpleMembershipProvider et essayer de coller à la logique par défaut créé par VS2012
avec le Internet template
(si je ne me trompe pas, l'une avec "SimpleMembershipProvider' out of the box).
Je suis coincé à la AccountController
où je ne peux pas mettre exactement comment je peux utiliser cette méthode:
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
De ce que je comprends, l'idée est d'obtenir redirigé vers l'emplacement où vous avez décidé de vous connecter (exactement ce que je veux accomplir). J'ai pris un coup d'oeil à la façon dont il est utilisé dans la vue :
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
La recherche d'un endroit où, en fait, ViewBag.ReturnUrl
est réglé à une certaine valeur, et j'ai seulement eu cette méthode ici:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
et je suis assez confus au sujet de exactement comment je suis censé obtenir l'emplacement de l'url. Je définir des points d'arrêt et je n'ai jamais vu returnUrl
être quelque chose de différent de null
qui, dans ce scénario semble assez logique pour moi, car il n'est pas d'obtenir la valeur, n'importe où (à moins que j'ai raté quelque chose, bien sûr).
Donc je ne peux vraiment pas comprendre comment ce travail. Je poste la dessus juste pour montrer que j'ai essayé de faire mes devoirs, j'ai étudier autant que je le pouvais, mais je n'ai pas trouvé de réponse donc je demande ici. Pourriez-vous nous fournir des explications, exemple sur la façon dont cela fonctionne réellement?
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de l'authentification par formulaires et l'utilisateur n'est pas authentifié ou autorisé l'ASP.NET la sécurité du pipeline sera redirigé vers la page de login et pass comme un paramètre dans la chaîne de requête de l' returnUrl égale à la page redirigé vers la page de connexion. L'action login saisit la valeur de ce paramètre et la met dans le ViewBag de sorte qu'il peut être passé à la Vue.
La Vue, puis stocke cette valeur dans la forme comme indiqué par cette ligne de code dans la Vue.
La raison pour laquelle il est stocké dans le point de Vue est donc que lorsque l'utilisateur effectue une Soumettre après la saisie de leur nom d'utilisateur et le mot de passe, l'action du contrôleur qui gère le poste auront accès à cette valeur.
Si le modèle de l'état est valide et ils sont authentifiés par l'appel de la WebSecurity.Connexion méthode elle appelle ensuite la méthode RedirectToLocal avec la valeur de returnUrl qui est venu de la Vue, qui venait de la connexion de l'action qui a créé la Vue.
La returnUrl valeur sera nulle si l'utilisateur n'est pas redirigé vers la page de connexion, comme c'est le cas lorsqu'ils suffit de cliquer sur le lien connexion en haut de la page dans la mise en page par défaut. Dans ce cas, l'utilisateur sera redirigé vers la page d'accueil après connexion réussie. Le but de l' returnUrl est d'envoyer automatiquement l'utilisateur vers la page qu'ils essayaient d'accès avant qu'ils ont été authentifiés/autorisé.
returnUrl
assez fiable à la base conditionnelle vérifier sur elle. Ce que je veux, c'est mettre en œuvre la logique spécifique si la redirection est de laAdminController
qui dans ce cas estreturnUrl = /admin
chaîne. Même si je pense que je commence à comprendre comment les choses fonctionnent, je suis toujours dans le doute si cette variable est assez sécurisé ou il peut facilement être changé?C'est parce que la valeur par défaut ASP.NET MVC modèle est à l'aide de L'authentification par formulaires, et les contrôleurs sont décorées avec
[Authorize]
attribut:Qui signifie que si l'utilisateur n'est pas authentifié, il sera redirigé vers la page d'ouverture de session définie dans l'attribut LoginUrl des formes de l'élément.
Lors de la redirection,
FormsAuthentication
qui est unHttpModule
aura pour effet d'ajouter l'url qui a été demandé dans la chaîne de requête automatiquement.Donc, si vous accédez à
/Account/Login
, vous ne recevez rien dans la chaîne de requête, car il est décoré avec des[AllowAnonymous]
attribut.Mais si vous accédez à
/Account/Manage
vous remarquerez que le returnUrl dans la chaîne de requête devient/Account/Manage
(/Account/Login?ReturnUrl=%2fAccount%2fManage)
De sorte que vous ne sont pas de réglage de la returnUrl, le cadre fait pour vous, il vous suffit d'utiliser dans le
AccountController
pour savoir où rediriger l'utilisateur après qu'il est authentifié.ActionResult Manage()
fonction de retour de ce :return RedirectToAction("Login", "Connexion", new {returnURL = "/Account/Manage"});
. Ce sera à la fin le même comportement, DANS le CAS où le cadre ne fait pas cela pour vous.Quand un utilisateur authentifié tente d'entrer dans une section de votre application qui nécessite une authentification, puis
returnUrl
entre dans l'image. L'Url demandée par l'utilisateur non authentifié est essentiellement stocké dansreturnUrl
.Vous pouvez passer par la PluralSight tutoriel: création d'Applications avec ASP.NET MVC 4
new { ReturnUrl = ViewContext.HttpContext.Request.UrlReferrer.PathAndQuery })
mais après ton post j'ai fait quelques tests, et il semble que tout est fait de construire. Je pense que la réponse est dans l'attribut [Authorize] c'est la mise en œuvre, mais il serait bien pour obtenir une explication de quelqu'un qui a une bonne compréhension.