如何在控制器之外的类中使用User.Identity?

3

用户登录系统后,我需要将一个变量放入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
你在哪里调用它?为什么不扩展HttpContextBase? - SLaks
我在一个静态类中调用它,该类作为帮助器使用。我如何使用HttpContextBase?它具有Equals和ReferenceEquals方法。 - Kenci
1
将其作为参数传递,而不是使用 HttpSessionStateBase - SLaks
在方法签名中使用“this”关键字是否意味着我在调用该方法时不必将其作为参数传递?因为它说我必须这样做。我如何将HttpContextBase参数传递给该方法? - Kenci
如果您使用操作过滤器来解决会话问题而不是扩展方法,您可以从过滤器上下文中获取它:filterContext.HttpContext.User.Identity.Name。请查看我的答案以解决您的会话问题:http://stackoverflow.com/a/8630059/576752 - frennky
@frennky 我会看一下的 :) - Kenci
1个回答

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的问题与问题无关 - 上面的答案是在控制器外部访问它的方法。

正如OP在调试器中看到的那样,在此特定情况下,即使在控制器内部也是空的 - 我怀疑它被“过早”地访问,因此确实是空的。

如果您需要处理AccountController,请提出一个新问题。


我从哪里可以使用HttpContext.Current.GetFirmaId()?它在我的控制器中没有显示出来。当从控制器调用GetFirmaId时,VS会提示需要一个参数。 - Kenci
1
@Kenci:HttpContext.GetFirmaId()。(HttpContext是返回HttpContextBase实例的属性)。你需要理解扩展方法的工作原理。 - SLaks
当我使用这种方法时,context.User.Identity.Name仍然为空。我按照您描述的方式从内置的AccountController中调用它:this.HttpContext.GetFirmaId();(在我登录后) - Kenci
@Kenci,那么问题与您的问题无关 - 上面的答案是在控制器之外的类中访问它的方法。就像您自己在调试器中看到的,在您特定的情况下,即使在控制器内部,它甚至也是空的 - 我怀疑您过早地访问它,所以确实为空。如果您需要帮助处理AccountController,请提一个新问题。 - Yahia
谢谢你的帮助 :) 如果您想编辑您的答案并加上最后一条评论,我很乐意给您打勾。 - Kenci
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接