我有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。
答案 0 :(得分:2)
你不能像你一样使用控制器。控制器是MVC应用程序的终点。如果需要从2个不同的端点执行操作,请将该代码包装在服务类中,并从两个控制器中调用该代码。
不要做var controller = new AcctountController()
- 这会给你未初始化的对象无法正常运行。最好是将控制器初始化留给框架,或者在最坏的情况下你可以使用ControllerFactory
,但我强烈反对这一点。