簡體   English   中英

在SPA中返回視圖時的AngularJS,.NET Web API和后端授權

[英]AngularJS, .NET Web API, and back-end authorization when returning views in a SPA

所以我想用AngularJS和.NET Web API編寫一個SPA。 我希望Angular能夠處理大部分路由。 但是,如何防止未經授權的用戶(無論身份驗證)獲取某些視圖? 我想在后端執行此操作,而不涉及.NET MVC,因為MVC返回整個視圖,這違背了SPA的目的。 同樣根據我的理解,Web API在向客戶端返回視圖方面沒有任何作用。 鑒於這是正確的,當返回請求的視圖時,Web API和MVC中的授權在SPA中變得無用。 我考慮編寫一些OWIN中間件來檢查傳入的AJAX調用的標頭,然后確定用戶是否有權接收視圖。 但我不知道從哪里開始。 如果編寫OWIN中間件來處理授權是現實的,我從哪里開始?

這有什么看似合理嗎? 或者我只是瘋了,我應該讓.NET MVC處理返回視圖?

跟進:MVC和Web API都有[授權]裝飾,並且傳遞了一個令牌。 身份驗證很好。 問題在於Angular。 當Angular處理路由時,它會從服務器請求一個視圖。 但是服務器不會進入.NET MVC或Web API,而是繞過MVC和Web API中的授權。 它只是回饋了視圖。 有前端授權,但這並不理想。 因此,當用戶被授權接收該視圖時,我需要后端處理返回視圖。

有保護“Web API”的有效案例,您不應放棄Web API的基本授權(因為即使沒有View,惡意用戶仍然可以訪問API。)因此,您最終將要授權訪問前端視圖和后端API。

但是,為了防止用戶訪問特定模板,您需要在“MVC控制器”或“操作方法”上應用“ Authorize屬性,以保護為您的模板提供服務。 聽起來好像您的客戶端框架直接從Web服務器上獲取文件(而不是激活MVC Controller Action來接收View。)

如果您沒有通過MVC控制器提供模板,則需要一些替代方法來保護模板(例如OWIN Middleware,是的。)

就個人而言,我建議使用MVC設施,以提供便利,並在將來繼續提供支持。 但是,如果您沒有任何MVC控制器,OWIN將是更合適的解決方案(例如,當SPA和API之間發生所有邏輯時,不需要MVC。)

為此:

當我使用挖空或角度創建單頁應用程序(SPA)時,我通常會將所有模板移動到部分模板中。 然后,我使用MVC視圖和控制器操作來提供這些部分。

這允許我授權訪問我的模板 這也允許我根據服務器端知識修改發出的模板內容 ,無論是安全性還是其他數據。 例如,我有時會使用User.IsInRole()根據用戶角色在模板中包含/排除內容(例如,發出一個模板,為管理員用戶提供管理員操作,並為常規用戶發出相同的模板但沒有管理員操作。 )

根據SPA的大小和復雜程度,我通常在單頁加載(單個MVC視圖)中提供整個SPI。這與假定模板來自服務器的模板(而不是,例如,元素)不兼容在當前的DOM)中,它為用戶提供了非常快捷的體驗,根據我的經驗,相當復雜的SPA的大小仍然比一些最常見的javascript框架小。

如果應用程序的復雜性或SLA要求它,我可以批量交付SPA的部分(多個MVC視圖,作為常規應用程序導航的一部分按需拉入瀏覽器)。 例如,〜/ Home / Index本身可以提供整個應用程序中使用的所有共享模板,但是〜/ Account / Index可以提供帳戶管理視圖,並且〜/ Uploader / Index可以提供資產上載視圖。 除非我打算使用這些功能,否則我實際上不需要將這些額外的帳戶和上傳者模板添加到應用程序中。

TL:DR? 使用MVC控制器提供包含模板的MVC視圖,並將[Authorize]屬性應用於需要限制為授權/認證用戶的任何控制器或操作。 為了簡單起見,考慮使用MVC View來提供整個SPA,並進一步考慮使用MVC部分視圖來幫助組織標記,你應該有類似〜/ Home / Index的東西,它只是Html.Partial調用的集合。 (沒有實際的標記。)

也就是說,現在你已經開始使用純粹的OWIN解決方案了。 如果SO上還沒有一個純粹的OWIN方法,我將在接下來的一周左右嘗試更新。

希望有所幫助。

當您使用AngularJs開發SPA時,您可能使用角度路徑擴展。 在這種情況下,您的視圖只是數據的占位符。 所以我要說你最關心的應該是數據(Web API)。 你肯定應該使用一些身份驗證。

對於需要一些非常具體的auth的其他視圖,您仍然可以將ASP.NET MVC與AngularJs結合使用。 我認為MVC部分是一個很好的解決方案。 您可以從角度控制器返回渲染的局部視圖。 當然,您可以使用Ajax請求它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM