User.IsInRole () не работает в балансировщике нагрузки - PullRequest
0 голосов
/ 25 февраля 2019

В настоящее время я работаю над веб-приложением, основываясь на ролях, которые мы должны отображать в пользовательском интерфейсе элементов управления.Роли хранятся в БД, и каждый раз, когда пользователь входит в систему, при извлечении идентификатора пользователя я обращаюсь к БД, получаю роль пользователя и сохраняю ее в файле cookie.Итак, для следующего запроса я выберу роль пользователя из User.IsInRole () и продолжу логику, которая произойдет в представлении.Все это прекрасно работает с одним сервером, но когда дело доходит до балансировщика нагрузки, это ведет себя странно и периодически, что создает проблему, поскольку User.IsInRole () иногда возвращает false.

Код в моем контроллере:

public ActionResult IsValidUser(string userName)
    {


        try
        {

                if (HttpContext!=null&& HttpContext.Request.Headers["username"] != null)
                {
                    userName = HttpContext.Request.Headers["username"];
                }

                //Get the roles by sending the user name
                userRole = _processor.GetUserRole(userName);

                UserViewModel user = new UserViewModel()
                {
                    UserName = userName,
                    Role = userRole
                };
                if (!string.IsNullOrEmpty(user.Role))
                {
                    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now, DateTime.Now.AddMinutes(2880), true, user.Role, FormsAuthentication.FormsCookiePath);
                    string hash = FormsAuthentication.Encrypt(ticket);
                    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
                    if (ticket.IsPersistent)
                    {
                        cookie.Expires = ticket.Expiration;
                    }
                    if(Response!=null)
                    Response.Cookies.Add(cookie);

                    if (!string.IsNullOrEmpty(Request.Form["ReturnUrl"]))
                    {
                        return View("Error");
                    }
                    else
                    {

                        return RedirectToAction("Index");
                    }
                }
                else
                {
                    return View("Error")
                }
            }
            else
                return RedirectToAction("Search");
        }
        catch (Exception ex)
        {
                            return View("Error);
        }


    }

Код в Global.asax.cs

 protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        if (HttpContext.Current.User != null)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity is FormsIdentity)
                {
                    FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                    FormsAuthenticationTicket ticket = id.Ticket;
                    string userData = ticket.UserData;
                    string[] roles = userData.Split(',');
                    HttpContext.Current.User = new GenericPrincipal(id, roles);
                }
            }
        }
    }

код в моем контроллере для выполнения логики:

 public FileContentResult ViewAttachment(string attachmentName, int attachmentId)
    {

        if (ConfigurationManager.AppSettings["Environment"] != Constants.ProductionEnvironment ||
            (User.IsInRole(Constants.Administrator) || User.IsInRole(Constants.Contributor) || User.IsInRole(Constants.Member)))
        {
            //Logic here
            return File(bytes, mimeType);
        }
        else
        {
            _logger.WriteInformation("Not authorized");
            return File(bytes, mimeType);
        }
    }

Я не уверен, какая там ошибка, но она не работает в балансировщике нагрузки, иногда она показывает «Пользователь не авторизован», но на самом деле пользователь авторизован.Это из-за куки или балансировки нагрузки?Любая помощь будет оценена.Заранее спасибо.

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