MVC3 Authorize: Это плохая форма для вызова авторизованного действия из другого действия? - PullRequest
2 голосов
/ 17 августа 2011

Обязательно ли использовать RedirectToAction при вызове действия контроллера из другого действия? В настоящее время я просто вызываю их напрямую, потому что не хочу, чтобы они возвращались, и поэтому я пропускаю тег Authorize для одного из моих действий (которое делает то, что я хочу).

Можете ли вы сообщить мне, если это плохая форма, и если да, я должен создать несколько новых действий для установки файлов cookie клиента или просто установить их непосредственно в LogOn() Действие?

Могу ли я вместо этого сделать SwitchClient приватным, а затем сделать общедоступное Авторизованное действие, которое будет использоваться только Администраторами на стороне клиента? Затем частное действие вызывается через действие LogOn, но к нему нельзя получить доступ, если пользователи не аутентифицированы как администраторы.

Вот мой код:

        [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);
        }

1 Ответ

1 голос
/ 17 августа 2011

Я бы реорганизовал логику «переключения клиента» в приватный метод или служебный класс.Оба метода действия контроллера будут вызывать закрытый метод.

Таким образом, код и ваше намерение будут менее запутанными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...