2017-07-26 70 views
2

我有一個使用多個控制器繼承的應用程序。我重寫我的產業的多層次Initialize(RequestContext requestContext),但每次我重寫Initialize方法,我稱之爲base.Initialize(requestContext);在ASP.NET MVC 5中,設置User對象的方法是什麼?

[Authorize] 
public class FirstBaseController: Controller 
{ 
    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     // Set few custom global things 
    } 

} 

public class SecondBaseController: FirstBaseController 
{ 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     // At this point, I am expecting that the `User` object is already set by identity 
     //check the claims value here. 
    } 
} 

但是,如果我嘗試從Initialize方法內部訪問User對象,我發現它尚未確定!

框架在什麼時候設置User對象?操作方法之前的哪個方法可以覆蓋User對象將被設置的位置?

我不想在這裏使用動作過濾器,因爲我想讓這個邏輯在每個請求上得到執行。

+0

我很困惑。爲什麼您認爲Action filter不會在每個請求上執行? –

+0

@ErikFunkenbusch我不想手動爲每個方法添加屬性,除非有辦法將其添加到所有方法。 +是否可以從操作過濾器中訪問'User'對象? –

+0

您可以通過操作過濾器中的「HttpContext.Current.User」訪問User對象。如果您查看實際的MVC源代碼,您將看到控制器上的User屬性僅從當前http上下文返回用戶。 –

回答

1

這將根據您用於驗證的方法而有所不同,但您應該安全地使用'OnActionExecuting'方法訪問User

你也可以實現,作爲一個動作過濾器和過濾器適用於每個控制器(或只是一個基類控制器 - 它會「貫徹」以繼承它的任何控制器)

1

使用JustDecompile要查看引用,用戶屬性確實導航到傳入Initialize(引用HttpContext)的引用爲RequestContext。因此,在初始化中,如果傳入該方法的requestContext變量的屬性爲HttpContext爲空或HttpContext.User引用爲空,則當前用戶在Initialize()中不可用。

OnActionExecuting是一個像@Eric說的好地方。

相關問題