2015-05-31 66 views
2

今天我來到了我的世界。 基本上,我使用EntityFramework中包含的默認ApplicationUserContext,並且在向用戶添加角色時,主題需要註銷角色以更新。事實上,這是正常的,因爲角色存儲在cookie中,每隔30分鐘或用戶每次登錄時加載信息。實體框架中的ApplicationUserContext爲null

所以在我的情況下,我試圖將特定角色添加到用戶,使用角色管理器,然後強制「辭職」,即註銷然後登錄。

_userManager.AddToRole(UserID, "the role of the world"); 
ApplicationUser theUser = _userManager.FindById(User.Identity.GetUserId()); 

if (returnUrl != null) 
{ 
    AccountController ac = new AccountController(); 
    await ac.Relogin(theUser); 
    return Redirect(returnUrl); 
} 

現在你看,我創建的AccountController的新實例,因爲我是在其他控制器和調用的方法「重新登錄(用戶)」

public async Task Relogin(ApplicationUser _user) 
    { 
     await SignInAsync(_user, false); 
    } 
    private async Task SignInAsync(ApplicationUser user, bool isPersistent) 
    { 
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
     AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, await user.GenerateUserIdentityAsync(UserManager)); 
    } 

現在,當我運行代碼,我得到的錯誤「對象引用不設置到對象的實例在此代碼:

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

這基本上意味着我的HttpContext爲空...我嘗試甚至還讓HttpContext的在我的控制器的d以這樣的參數發送。它在控制器中不是null,但一旦它進入AccountController,userManager變爲空......發生了什麼?

public async Task Relogin(ApplicationUserManager _userManager) 
+0

你爲什麼要創建一個'AccountController'的新實例?爲什麼不直接調用'SignInAsync'然後重定向呢? –

+0

是的,我應該從一開始就這樣做!謝謝 – MasterJohn

回答

1

當你使用async/await時,工作被卸載到另一個線程。 HttpContext爲null的原因是因爲您不再處於請求線程中,因此當前的HttpContext實例無法訪問(線程靜態)。

要確認,請移除異步/等待並嘗試。

作爲快速解決方法,您可以將對AuthenticationManager的引用作爲參數參數傳遞。

+0

我已經將引用發送給AuthenticationManager,它作爲一個快速修復工具。 – MasterJohn