2017-10-09 76 views
-1

好吧,所以我努力嘗試在我的ASP.NET MVC5(Web API 2)項目中獲得身份驗證過程。首先,這裏有一些要求:在ASP.NET(MVC5)web api項目中授權用戶

  • 我不能使用實體框架(所有訪問DB需要通過存儲過程來完成)
  • 需求爲目標的.NET Framework 4.5.2
  • 我不使用ASP.NET的核心
  • 我想能夠使用承載(或類似)令牌認證
  • 我想24小時
  • 之後,如果用戶註銷無效令牌或自動使它們無效
  • 我想p在向「login」(或「token」)端點發送請求時,請注意ass(和接收)XML(注意理想情況下,解決方案應該遵守「Content-Type」和「Accepts」標題,所以如果我發送JSON,在JSON中,如果我發送XML,它應該以XML響應)
  • 我不會使用外部提供者(例如谷歌)很快(也許永遠不會)
  • 我想用<Authorize>屬性,以幫助保護其他端點
  • 我使用VB.NET,雖然這個問題的答案可以在C#(我可以將它們轉換或它們改寫以適應)
  • 我想令牌存儲在數據庫中,所以我可以記錄哪些用戶正在做的API中的哪些

(注意,有很多的原因,我不能改變以上)

我試圖做到這一點與歐文(OAuth的),但我發現這個比較的要求時,以下問題:

  • 我似乎無法發送令牌端點的任何XML從驗證端點
  • 響應(成功和不成功的)在JSON
  • 註銷

的時候,我不能無效令牌,我很高興從OAuth的移開如果是去我想要的東西的最佳方式。我寧願使用Microsoft構建的nuget包(即沒有第三方解決方案),或者我很樂意部分推出我自己的解決方案(我希望儘可能多地利用內置或Microsoft構建的代碼,包括身份和聲明所以我可以儘量減少測試工作)。

我已經閱讀了大量關於此問題的StackOverflow問題,並在互聯網上搜索堆,但大多數文章堅持使用OAuth,儘管存在上述問題,或者他們依賴於EntityFramework。我目前的解決方案使用這裏的代碼(幾乎複製/粘貼ApplicationOAuthProvider.GrantResourceOwnerCredentials()中的一些自定義代碼):https://www.codeproject.com/Articles/1187872/Token-Based-Authentication-for-Web-API-where-Legac

感謝您的幫助!

+0

您可以通過實體框架訪問存儲過程。你有什麼特別的問題?我的理解是.Net授權並不與實體框架相關聯(不是以我的經驗)。其餘部分無法幫助,但如果您可以發佈一些代碼並指出錯誤發生的位置,那肯定會有所幫助 –

+0

@ Nick.McDermaid謝謝 - 關於實體框架的公平點,但我不確定從何入手問候存儲過程(我會分開看)。我更多地指出大多數資源/教程直接使用EntityFramework,這在現階段有點無益。不幸的是(幸運的是)代碼工作正常,但所需功能(無效令牌,存儲令牌,使用XML)不能實現我所知道的。有沒有其他的認證方法可以研究? – randomusername

+0

是否值得試圖用OAuth逐個解決您的未解決問題?如果他們可以克服,也許這是一個選擇?例如在我的研究中,爲了更好地理解這一點,我遇到了這個頁面https://www.codeproject.com/Articles/1205160/ASP-NET-Core-Bearer-Authentication,它有自己的定製控制器提供令牌。所以看起來您可以編寫自己的接受和返回XML的令牌端點。我在這裏有點深刻,但是如果我試圖幫助解決問題,我通常會發現我學到了一些東西。 –

回答

0

我做了一些更廣泛的研究,它看起來像OAuth不適用於我的具體情況。儘管它看起來像一個很好的身份驗證方法,但我確實需要通過數據庫使令牌失效,並且我需要API始終發送/接收XML(這些在使用OAuth時顯然不適用)。

爲了解決這些問題,我推出了自己的基於令牌的解決方案,在客戶端創建一個散列標記,所以我從來沒有通過線路發送密碼(這有點更好),因爲標記是在客戶端(請注意,我正在控制客戶端發生的事情 - 這些都在內部客戶端,我正在編寫這些客戶端將使用的庫)。這涉及到我創建我自己的過濾器,它繼承了System.Web.Http.AuthorizeAttribute

如果有人絆倒這個問題,並提供一個非常好的答案,我很樂意將他們的標記爲接受。