1

存在一個使用asp.net成員身份驗證(System.Web.Security.MembershipProvider的子類)的現有mvc 3應用程序。此應用程序只能使用網絡瀏覽器訪問。在已存在的mvc項目中使用基於令牌的身份驗證

現在,應用程序需要支持移動應用程序,並且我已經將WebApi 2控制器引入到用於處理移動應用程序請求的項目中。

問題是我沒有清楚如何對移動應用程序用戶進行身份驗證。

看來,我必須提供令牌類型認證機構,其中移動應用已經提交令牌(驗證後發佈)每個請求。但我不知道如何實現它(如使用什麼框架/包),並讓它與現有的並行工作MembershipProvider

那麼,我該如何提供一種方法來驗證Web Api請求,並且還爲MVC Controller請求保留現有的asp.net MembershipProvider。

另外,如果這可以在其他方面做得更好?

回答

2

它不必是驗證移動用戶的「令牌」。

用於驗證webapi請求的令牌概念受到了DotnetOpenAuth和OWIN已被.NET世界採用的OAuth2協議的很大關注。 OAuth2支持多個「流」,有趣的是除了「被動」流(瀏覽器重定向到外部登錄頁面)之外,還有「活動」流(專爲活動客戶端設計,如移動應用程序)。

因此,切換到OAuth2意味着您正在使用支持所有主要方案的一致性身份驗證協議。

對於您(您似乎有興趣)可能的方法之一是採用令牌方法來驗證webapi請求。這是可能的,但這意味着您有兩種不同的身份驗證方法,被動客戶端的基於cookie的表單身份驗證和活動客戶端的基於令牌的身份驗證。

我會說這種氣味。

我寧願想一個統一的方法。

要麼完全轉向OAuth2,這意味着您爲被動客戶端和活動客戶端都採用了DotnetOpenAuth/OWIN。

或者您堅持使用Forms身份驗證,併爲您的活動客戶端啓用它。

後者很簡單。您的活動客戶端攜帶表單身份驗證Cookie,而不是攜帶令牌。要發佈這樣的cookie,您只需公開一個匿名的webapi方法,該方法需要登錄名和密碼,並將表單cookie附加到響應中。

假設你的客戶端支持cookies,服務器發佈的表單cookie被用於連續的請求,你所要做的就是讓Authorize屬性通過你的web api方法。表單模塊將拾取cookie並在請求的生命週期中填充IPrincipal,就像它對於常規請求一樣。

總結:

向基於令牌的認證移動:

優點:

  • 在未來,你可以很容易地處理更復雜的身份驗證方案(例如像使用外部身份驗證提供商)
  • 現在基於令牌的OAuth2常用,因此您可以更輕鬆地與其他應用程序集成

缺點:

  • 遷移成本可能:首先必須獲得的知識,做一些[R & d,然後再遷移

與窗體身份驗證堅持:

優點:

  • 你已經擁有了它,你只要啓用它活躍客戶

缺點:

  • 窗體身份驗證是不是真正的「身份驗證協議」。這意味着沒有明顯的方式可以輕鬆整合外部身份驗證提供商/消費者
+0

我認爲cookie方法看起來不錯。如果我在正確理解了你之後,在通過Login Url驗證了用戶之後,我只需從響應中獲取「.ASPXAUTH」cookie並將它發送回下一個請求。聽起來簡單而實用。 – Jatin 2014-08-30 11:20:20

+0

從技術上講,你抓住cookie並將其發送回去。在實踐中,如果客戶端的代理支持cookie,則不需要執行任何操作,應該選取cookie並自動附加到連續的請求中。 – 2014-08-30 11:41:56

+0

請記住只是**在發出呼叫您的登錄請求時發出一個新的cookie,而不是您稱之爲「搶」一個,因爲此時沒有cookie來「抓取」。發出一個cookie意味着你通過創建一個'FormsAuthenticationTicket'來創建一個,你加密這個票據('FormsAuthentication.Encrypt')並且把這個cookie附加到響應中('Response.AppendCookie')。 – 2014-08-30 17:12:59