如何让User.Identity在Controller之外的类中工作

时间:2011-12-25 21:00:48

标签: asp.net-mvc asp.net-mvc-3 asp.net-membership

用户登录系统后,我需要在Session中添加一个变量。我用扩展方法做这个:

登录方式:

[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 :(得分:0)

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的问题与问题无关 - 上面的答案是如何在Controller之外的类中访问它。

如果OP在调试器中看到它在控制器内部甚至是空的 - 在这种特定情况下 - 我怀疑它在过程中“过早”被访问,因此它确实是空的。

如果您在处理AccountController时需要帮助,请提出新问题。