1

類似的問題已經回答here,但答案似乎不適用於我的情況。如何使用自定義身份驗證和內存中的主機進行ASP.NET Web API集成測試

我想測試我的Web Api中使用JWT認證的認證/授權過程。

我的身份驗證通過我添加到我的HttpConfiguration的自定義MessageHandler來處理。通過控制器/方法上的簡單[Authorize]屬性處理授權,以限制對其的訪問。

我設置我已經從我的令牌認證過程中提取這種方式的主要(在我的自定義MessageHandler):

Thread.CurrentPrincipal = principal; 

if (HttpContext.Current != null) 
{ 
    HttpContext.Current.User = principal; 
} 

這整個過程工作正常,當我在本地IIS手動測試。

但隨着在內存中的託管樣進行測試時hereApiController.User屬性存儲被用於授權與[Authorize]得到我的電話測試Thread.CurrentPrincipal(我當前會話窗口負責人)委託,而不是一組在認證期間。 如果我將我的Thread.CurrentPrincipal設置爲null,那麼我只能得到不好的請求。

TL; DR如何測試我的認證/授權管道與存儲託管 ?由於它在我的測試中將ApiController.User值設置爲Thread.CurrentPrincipal的值,並且沒有獲得我在驗證過程中成功設置的值。

我想我可以設法解決自定義[Authorize]屬性獲取Thread.CurrentPrincipal而不是ApiController.User,但我想避免這種情況。

在此先感謝。

編輯澄清:所有此管道(認證然後授權)正常運行良好託管在運行的IIS(HttpContext在內存中爲null)。我只是試圖在內存託管中測試它(如果可能的話)。在內存託管測試期間,在我的自定義MessageHandler中放置斷點時,我可以看出Thread.CurrentPrincipal設置正確,只是[Authorize]似乎並不在意,因爲在我的ApiControllers中ApiController.User屬性已經設置爲在我的測試我Thread.CurrentPrincipal值的值(我的本地Windows會話本金)

+0

其中的ASP.NET Web API的版本你在這裏用嗎?你能發佈驗證請求的消息處理程序代碼嗎? – tugberk

+0

我使用ASP.NET Web API 2.1和[這裏](https://github.com/jamiekurtz/JwtAuthForWebAPI/blob/master/src/JwtAuthForWebAPI/JwtAuthenticationMessageHandler.cs),你可以找到一個有點類似的消息處理程序來驗證請求(ligne 110我沒有使用PrincipalTransformer,而是直接從tokenHandler.ValidateToken分配主體) – Dace

回答

1

我有以下的"Retrieving and Assigning the Current Principal" section of Chapter 15 in "Designing Evolvable Web APIs with ASP.NET"列出的指導成功:

在ASP.NET的Web API 2.0版本,可以解決這個問題通過使用 新的HttpRequestContext類。首先,檢索當前標識 並將其分配給當前請求對象,而不是 靜態屬性。其次,不同的主機可以使用不同的 HttpRequestContext實現

總之,在消息處理程序,做的不是當前線程設置這個和的HttpContext的負責人:

request.GetRequestContext().Principal = principal; 
相關問題