Comment puis-je changer la ASP.Net MVC acceptation de Connexion en fonction de leur rôle?
J'ai le code suivant, j'ai tapé dans le Compte de Contrôleur dans mon projet MVC et je suis l'administrateur et le gestionnaire de rôles. Quand je me connecte je obtenir redirigé vers ma maison d'index au lieu d'être redirigé vers mon AdminApp index. Des idées d'où je suis ne va pas dans mon code?
[AcceptVerbs(HttpVerbs.Post)]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
Justification = "Needs to take same parameter type as Controller.Redirect()")]
public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
{
if (!ValidateLogOn(userName, password))
{
return View();
}
FormsAuth.SignIn(userName, rememberMe);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
if (User.IsInRole("Administrator") || (User.IsInRole("Manager")))
{
return RedirectToAction("Index", "AdminApp");
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
Vous devez vous connecter pour publier un commentaire.
La raison que votre code ne fonctionne pas comme prévu, c'est parce que le
User
a techniquement pas été signé et authentifié. Dire quoi? Mais vous l'avez fait appel SignIn!FormsAuth.SignIn(userName, rememberMe);
- qui dans ce cas est juste un wrapper pourFormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
- le asp.net autorisation de cookie sur le navigateur d'utilisateurs dans le cadre de la réponse. C'est seulement pour les demandes après ce point que le navigateur de l'utilisateur aura le cookie, causant la asp.net l'adhésion pour configurer correctement l'Utilisateur de l'objet. Tous de votre code dans la méthode d'ouverture de session est toujours en supposant qu'un utilisateur anonyme, de sorte que votre IsInRole vérification échoue, et vous êtes redirigé à la maison. Placez votre instruction if sur une autre page et après que vous avez signé, vous verrez que maintenantUser.IsInRole
fonctionne comme prévu. (Et en effet, c'est ce que vous pouvez utiliser de l'Utilisateur.IsInRole pour, tout simplement pas au cours du processus d'ouverture de session)Alors comment vérifier pendant le processus d'ouverture de session?
Roles.IsUserInRole
ouRoles.GetRolesForUser
sont un couple de façons, par exemple.:Vous devez explicitement spécifier le nom d'utilisateur de la connexion de l'utilisateur, ce qui en fait l'exécution d'une requête contre l'adhésion de la banque de données. Sur cette note, je crois que le code ci-dessus aurait comme conséquence de provoquer deux requêtes à exécuter, que vous pouvez trouver moins idéal. C'est là que les Rôles.GetRolesForUser pourrait être une meilleure option:
Espère que ça aide!
Je suis en utilisant VS 2013 et la nouvelle Identité du modèle, j'ai fini par aller avec ceci:
Vous besoin d'onu-nid de l'instruction if. Réviser comme suit:
Changer cela:
à ceci:
Le problème est la la ligne
if(!String.IsNullOrEmpty(returnUrl)))
évalue à True, car returnUrl paramètre est l'url de la page où vous venez par défaut.