Comment rediriger vers returnUrl travail dans Asp.Net MVC5
J'ai commencé un nouveau MVC 5 site, à l'aide de la nouvelle Asp.Net d'Identité avec Owin. Dans mon "compte" contrôleur qui a l'attribut [Autoriser], j'ai assez standard des actions;
//GET: /User/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
//POST: /User/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
try
{
if (ModelState.IsValid)
{
var userApi = new UserService();
var apiUser = await userApi.LogIn(UserManager, model.CardNumber, model.Pin, model.RememberMe);
if (apiUser != null)
{
await SignInAsync(apiUser, model.RememberMe);
if (string.IsNullOrEmpty(returnUrl))
{
return RedirectToAction("UserLoggedIn", "User");
}
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
}
catch (Exception ex)
{
Trace.TraceError("Cannot login {0}", ex.ToString());
Response.AppendToLog(ex.ToString());
ModelState.AddModelError("", ex.ToString());
}
//If we got this far, something failed, redisplay form
return View(model);
}
Ma question est en ce qui concerne la returnUrl comportement, le code ci-dessus fonctionne, dans le sens que, si un utilisateur n'est pas connecté et appelle une action dans un contrôleur qui possède l'attribut [Autoriser], il est envoyé à la connexion des actions ci-dessus et est ensuite retourné à la contrôleur/action qui a été demandé. Ce qui est génial, MAIS comment?? Et est-il sûr?
Dans cet article sur la "La prévention ouvrir rediriger les attaques"(pour les versions antérieures de Asp.Net MVC), la recommandation est de faire une vérification sur le returnUrl que c'est une url locale avant de faire la redirection, c'est que quelque chose que je doit encore le faire ou est-il maintenant géré par le cadre?
Cheers,
Ola
OriginalL'auteur Ola Karlsson | 2013-12-17
Vous devez vous connecter pour publier un commentaire.
Vous devez vérifier si l'url est locale, en effet, à l'aide de cette méthode (il n'est pas géré par le framework automatiquement): http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.islocalurl%28v=vs.118%29.aspx
Pourquoi n'essayez-vous pas de manipuler les returnUrl et voir ce qui se passe? Par ailleurs, dans votre code, la
returnUrl
argument n'est jamais utilisé.Oui je pense que ce serait une option. Je sais que le returnUrl n'est jamais utilisé dans mon action, mais le site redirige correctement, c'est pourquoi je me demandais comment il fonctionne, de la magie, ou tout simplement que quelque chose se passe?Ou est-ce qu'ils ont ajouté la prise en charge automatique pour ce genre de choses?
C'est assez étrange comportement, en effet. Je ne trouve rien sur le returnUrl manipulation mvc 5, donc je suppose qu'il doit fonctionner de la même comme dans les anciennes versions.
J'ai trouvé ce qui parle blogs.msdn.com/b/webdev/archive/2013/07/03/... mais pas vraiment beaucoup plus sage, je dois l'admettre.
OriginalL'auteur Marthijn
Comme Sandeep Phadke dit, la returnUrl Paramètre est rempli, en raison de la configuration de démarrage.Auth.cs.
La CookieAuthenticationOptions a une propriété ReturnUrlParameter qui est par Défaut à "returnUrl". C'est la raison, pourquoi il ressemble à de la magie. Vous pouvez le Modifier à tout ce que vous voulez:
Vous pouvez ensuite Modifier la AccountController de Connexion-Action:
OriginalL'auteur Kirsten
OriginalL'auteur Vivekh
Pour répondre à votre première question sur la façon dont l'Url de redirection est de l'installation, il configuré en
Startup.Auth.cs
qui est appelée à partir deStartup.cs
et est marqué avec un attribut qui est probablement recherché par les OWIN cadre sur l'application de démarrage et les deux fichierspartial
étendre unStartup
classe.Dans
Startup.Auth.cs
il y a une classe pour configurer les options d'authentification et a généralement le code suivantJ'ai ajouté le
CookieSecure
option pour vous assurer que les témoins ont été signés et qui est recommandé comme une bonne pratique de sécurité, autre que celle de son chaudière plaque de code.Plus de documentation sur les CookieAuthenticationOptions si vous le souhaitez.
CookieSecureOption.Always
. En outre, à partir de la documentation, cela vous oblige à utiliser le protocole HTTPS pour le développement local. Par défaut, ilCookieSecureOption.SameAsRequest
. Donc, si votre site est en HTTPS, il est recommandé de ne pas modifier leCookieSecure
de propriété, car le paramètre par défaut est assez sécurisé.OriginalL'auteur Sandeep Phadke