2

Est-il nécessaire d'utiliser RedirectToAction lors de l'appel d'une action du contrôleur à partir d'une autre action? Je les appelle directement directement parce que je ne veux pas qu'ils reviennent, et ainsi je contourne la balise Authorize pour une de mes actions (ce qui fait ce que je veux). Pouvez-vous s'il vous plaît laissez-moi savoir si c'est une mauvaise forme, et si oui, dois-je créer plusieurs nouvelles actions pour définir les cookies du client ou simplement les définir directement dans l'action LogOn()? Puis-je à la place rendre SwitchClient privé, puis effectuer une action Autorisée publique à utiliser uniquement par les administrateurs côté client? Ensuite, l'action privée est appelée via l'action LogOn, mais elle n'est pas accessible à moins que les utilisateurs ne soient authentifiés en tant qu'administrateurs.Autorisation MVC3: est-ce une mauvaise forme d'appeler une action autorisée à partir d'une autre action?

Voici mon code:

 [HttpGet] 
     [CustomAuthorizeAccess(Roles = "Administrator", RedirectResultUrl = "Unauthorized")] 
     public ActionResult SwitchClient(string client) 
     { 
      if (Request.Cookies["Client"] == null) 
      { 
       HttpCookie clientCookie = new HttpCookie("Client", client); 
       Response.Cookies.Add(clientCookie); 
      } 
      else 
      { 
       Response.Cookies["Client"].Value = client; 
      } 
       return new RedirectResult(Request.UrlReferrer.AbsolutePath); 
     } 

     [HttpPost] 
     public ActionResult LogOn(LogOnModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (MembershipService.ValidateUser(model.UserName, model.Password)) 
       { 
        FormsService.SignIn(model.UserName, model.RememberMe); 
        if (Url.IsLocalUrl(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         //Add user's role to cookies (assumes each user only has one role) 
         string role = Roles.GetRolesForUser(model.UserName).First(); 
         HttpCookie roleCookie = new HttpCookie("Role", role); 
         if (role == "client1") 
         { 
          SwitchClient("client1"); 
         } 
         else if (role == "client2") 
         { 
          SwitchClient("client2"); 
         } 
         else if (role == "Administrator" || role == "client3") 
         { 
          SwitchClient("client3"); 
         } 
         //Make role cookie persistent for 7 days 
         //if user selected "Remember Me" 
         if (model.RememberMe) 
         { 
          roleCookie.Expires = DateTime.Today.AddDays(7); 
         } 
         if (Response.Cookies["Role"] != null) 
         { 
          Response.Cookies["Role"].Value = null; 
          Response.Cookies.Remove("Role"); 
         } 
         Response.Cookies.Add(roleCookie); 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "The user name or password provided is incorrect."); 
       } 
      } 
      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 
+2

Est-ce que cela contourne l'autorisation? Si oui alors - absolument pas le faire. Il existe une différence entre les méthodes internes et externes (que ce soit public/privé ou exposé/non-exposé à un service). –

+0

Dans la mesure où je peux le dire, il contourne, car dans l'action 'LogOn()', j'ai déjà appelé 'FormsService.SignIn (model.UserName, model.RememberMe);' avant d'appeler le 'SwitchClient' (et cela fonctionne pour n'importe quel client, peu importe s'ils sont le rôle de 'Administrator' ou pas –

Répondre

1

je serais factoriser la logique « client de commutation » dans une méthode privée ou une classe utilitaire. Les deux méthodes d'action du contrôleur appellent la méthode privée.

De cette façon, le code et votre intention seraient moins déroutants.

+0

Merci c'était ce que je pensais après avoir lu le commentaire de pst! –

Questions connexes