2015-01-30 6 views
1

У меня есть проект Mvc5 и я использую Owin.Mvc5 HttpContext return null

Im получение аутентификации из 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

Можете ли вы показать, как вы выполняете вызов с другого контроллера на 'SignInAsync'' AccountController'? – MonkeyCoder

+0

Что вы пытаетесь достичь здесь? –

+0

ОК я редактирую. @MonkeyCoder –

ответ

2

Вы не можете использовать контроллеры, как вы. Контроллеры являются конечными точками в приложении MVC. Если вам нужно выполнить операцию из двух разных конечных точек, оберните этот код в классе службы и вызовите этот код с обоих ваших контроллеров.

Никогда не делайте var controller = new AcctountController() - это даст вам не-инициализированный объект, который не будет работать правильно. Лучше всего оставить инициализацию контроллера в рамках, или в худшем случае вы можете использовать ControllerFactory, но я очень отговариваю от этого.

Смежные вопросы