2013-04-09 60 views
2

在我的asp.net mvc4項目中,我使用ApiControllers爲Web客戶端和移動客戶端提供服務。爲了保護Web服務,我使用[Authorize]註釋。 所以現在,網絡客戶端工作正常。但是,當我傾向於從移動應用程序(例如Android)調用某個Web API時,出現錯誤。 當我的代碼片斷回頭一看:ASP.NET MVC4 Web API和會話變量

[Authorize] 
    public List<double> GetSomeInfo(int param1, string param2) 
     { 
      User user = SessionData.CurrentUser; 
      // do something using user.UserId 
      // .... 

     } 

會話數據並持有,只有當他連接到Web應用程序的用戶連接的屬性。但對於移動客戶端,會話數據爲空。那麼,有沒有什麼合適的方法來解決這個問題。 在我看來,我認爲userId應作爲任何Web API的參數提供,可能需要它來做一些處理。 你覺得呢?

+0

你檢出了[IdentityModel](https://github.com/thinktecture/Thinktecture.IdentityModel.45)嗎? – 2013-04-09 08:13:25

+0

你正在使用哪種認證?表單身份驗證不適用於移動客戶端,請考慮使用基本身份驗證或數字身份驗證 – 2013-04-09 08:13:37

回答

1

你說的是兩個不同的東西:

  • 會議

正如達雷爾說,網絡API並沒有設計,支持Asp.net會話。 HTTP和Rest服務是無狀態的 - 因此,每個HTTP請求都應該攜帶足夠的信息,以便接收者對其進行處理,使其與HTTP的無狀態特性完全一致。 因此,不要依賴會話變量,而是在請求中添加更多參數。 當然,在Web Api中有一種使用會話的方式,我建議你使用它。

  • 認證

因爲只有PARAMATERS(如用戶ID,帳戶ID,...)工作是不是很安全,你必須使用身份驗證和授權。我強烈建議您閱讀asp.net web api網站中的security section。 Web Api支持許多身份驗證(基本,OAuth,Windows,自定義...)。你必須選擇什麼是最適合你的。

+0

是的,你是絕對正確的,當我發佈這個問題時,我仍然在學習MVC4和Web API,但是我知道我有一個更清晰的想法,並且我完全按照你的建議去做。尊重Web API的無狀態定義爲了安全起見,我使用了基本認證。現在Web和移動客戶端都工作正常 – mahoosh 2013-05-18 16:40:55

+0

完美,好工作先生! – Cybermaxs 2013-05-19 08:11:01

0

Web API的設計不支持會話,因爲它們是HTTP反模式。如果您已設置必要的身份驗證機制,則可以通過訪問Thread.CurrentPrincipal來獲取當前已通過身份驗證的用戶。

+0

我似乎無法理解您在說什麼,請提供給我一個鏈接或一些代碼片段? – mahoosh 2013-04-10 11:32:19