Mvc5 HttpContext返回null

时间:2015-01-30 12:42:41

标签: c# .net asp.net-mvc-5 asp.net-identity owin

我有Mvc5项目,我正在使用Owin。

我从OwinContext获取身份验证,

private IAuthenticationManager AuthenticationManager
{ 
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

AuthenticationManager让用户登录。

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);

    Session_Add(user);

}

这是我在HomeController中的调用。我试图在facebook回调后登录。

public ActionResult Index()
{
    try
    {
        if (Request.QueryString["code"] != null)
        {
            string code = Request.QueryString["code"].ToString();
            string state = "";
            string type = "";
            var fb = new FacebookController();
            var me = fb.GetUserInfo(fb.GetAccessToken(code, state, type));
            new AccountController().LookUserFromFacebook(me);
        }

        return View();
    }
    catch
    {
        return View();
    }
}

当登录表单提交给AccountController时,用户可以登录。但问题是,如果我从另一个控制器调用SignInAsync方法,HttpContext总是返回null。我认为,因为这个调用不是请求,所以控制器不会创建上下文。

如果我致电SignInAsync,那么解决方案是什么。

THX。

1 个答案:

答案 0 :(得分:2)

你不能像你一样使用控制器。控制器是MVC应用程序的终点。如果需要从2个不同的端点执行操作,请将该代码包装在服务类中,并从两个控制器中调用该代码。

不要做var controller = new AcctountController() - 这会给你未初始化的对象无法正常运行。最好是将控制器初始化留给框架,或者在最坏的情况下你可以使用ControllerFactory,但我强烈反对这一点。