Как заставить User.Identity работать в классе за пределами контроллера - PullRequest
3 голосов
/ 26 декабря 2011

После того, как пользователь войдет в систему, мне нужно поместить переменную в сеанс.Я делаю это с помощью метода расширения:

Метод входа:

[HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                    int id = this.HttpContext.GetFirmaId();
                    String username = this.HttpContext.User.Identity.Name;

                    //SessionExtensions.SetFirmaId(Session, model.UserName);

                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        if (User.IsInRole("Administrator"))
                        {
                            RedirectToAction("Index", "Admin");
                        }
                        else
                        {
                            return RedirectToAction("Index", "Home");
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Brugernavn eller password er forkert.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

Метод расширения:

public static int GetFirmaId(this HttpContextBase context)
    {

        var firmaid = context.Session["firmaid"] as int?;

        if (firmaid == null)
        {
            // Hvis firmaid er røget ud af Session, skal den firmaid som tilhører brugeren hentes

            firmaid = SetFirmaId(context.Session, context.User.Identity.Name);

        }

        return (int)firmaid;
    }

Проблема в том, что context.User.Identity.Name возвращает пустую строку.

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 26 декабря 2011

1001 * попробовать *

public static int GetFirmaId(this HttpContextBase context)
        {

            var firmaid = context.Session["firmaid"] as int?;

            if (firmaid == null)
            {
                // Hvis firmaid er røget ud af Session, skal den firmaid som tilhører brugeren hentes

                firmaid = SetFirmaId(context.Session, context.User.Identity.Name);

            }

            return (int)firmaid;
        }

ОБНОВЛЕНИЕ - согласно комментарию: используйте его так же, как this.HttpContext.GetFirmaId() с вашего контроллера.

Некоторые полезные ссылки:

ОБНОВЛЕНИЕ 2 - согласно комментариям:

Проблема того, чтобы быть User.Identity.Name, не имеет отношения к вопросу - ответ выше - что нужно сделать, чтобы получить доступ к нему в классе вне Контроллера.

КАК ОП увидел в отладчике, что в данном конкретном случае он даже пуст внутри контроллера - я подозреваю, что к нему обращаются "слишком рано", так что он действительно пуст.

Если вам нужна помощь по работе с AccountController, задайте новый вопрос.

...