2014-09-03 95 views
0

我現在對如何在ASP.NET MVC 5中實現身份驗證感到非常困惑。這是我第一次使用ASP.NET MVC,我習慣於桌面應用程序。有像OWASP,OAuth,FormsAuthenticationTicket和其他我真的很難跟進的其他術語。在ASP.NET MVC中實現身份驗證困惑5

我決定只是爲初學者做一個簡單的登錄頁面。只需檢查數據庫的用戶名和密碼,如果存在,則用戶通過身份驗證。到目前爲止,根據我讀過的內容,我可以這樣做來實現IAuthenticationFilter。我已經實現OnAuthentication像這樣:

public void OnAuthentication(AuthenticationContext context) 
{ 
    IIdentity ident = context.Principal.Identity; 
    if (!ident.IsAuthenticated || !ident.Name == "randy") // Name is just for testing 
    { 
     context.Result = new HttpUnauthorizedResult(); 
    } 
} 

對於OnAuthenticationChallenge,我只是,如果用戶未通過身份驗證重定向到一個登錄操作方法(如果結果是HttpUnauthorizedResult,如果用戶沒有通過驗證思考它的代碼,它像就像OnAuthentication邏輯一樣,爲什麼我不能只重定向到那裏,我基於這些代碼在Web上的例子)。

在LogIn操作方法中,有一個UserRepository用於檢查用戶是否存在。但是,如果用戶存在,我不知道如何將其設置爲上下文的Principal。我不知道我是否做得對,所以請對此評論。

我想我的問題是:

  1. 是我在做什麼正確的嗎?

  2. 爲什麼Web中的示例只是在OnAuthentication中重定向,如果用戶未通過身份驗證。爲什麼要等待OnAuthentication執行?

  3. 如果我所做的是正確的,我該如何從LogIn Action方法設置Principal?我如何清除它?如果我理解正確,這是登錄/註銷(設置主體/清算主體)的同義詞嗎?

  4. 如果我所做的一切都是錯誤的,或者即使它是正確的,您是否可以指示我從哪裏開始學習ASP.NET MVC身份驗證?當我搜索時,主題是針對特定實現的某些主要假設理解某些概念的內容。我很難從哪裏開始。

回答

1

我正在做的是正確的?

考慮下面的代碼:

public void OnAuthentication(AuthenticationContext context) 
{ 
    IIdentity ident = context.Principal.Identity; 
    if (!ident.IsAuthenticated || !ident.Name == "randy") // Name is just for testing 
    { 
     context.Result = new HttpUnauthorizedResult(); 
    } 
} 

不管底層框架,你在這個具體的例子混合authenticationauthorization

爲什麼Web中的示例只是在OnAuthentication中重定向,如果用戶未通過身份驗證。爲什麼要等待OnAuthentication執行?

具體爲ASP.Net MVC和不顧使用的認證框架,授權給特定控制器應該使用AuthorizeAttribute,其中有大量的例子來控制。請記住,無論您使用的框架是什麼,角色都是開箱即用的,但最新最好的是使用索賠而不是角色(AuthorizeAttribute that uses Claims)。

如果我所做的是正確的,我該如何設置LogIn Action方法中的Principal?我如何清除它?如果我理解正確,這是登錄/註銷(設置主體/清算主體)的同義詞嗎?

沒有進入細節有關complicated ASP.Net Pipeline(即MVC已經很好地抽離了MVC開發人員,所以我們並不需要使用它的99%的時間),有事件發生當有人發送請求到IIS Web服務器。管道和安全框架主要負責關於設置當前用戶身份驗證和授權(角色/索賠)的細節。其中之一就是IPrincipal的價值。在正常和不太複雜的情況下,您不需要通過安全框架(當您調用框架特定的方法來記錄某人進入或退出時)設置或刪除此值(這是自動完成的)。

如果我所做的一切都是錯誤的,或者即使它是正確的,你能指示我從哪裏開始學習ASP.NET MVC認證嗎?當我搜索時,主題是針對特定實現的某些主要假設理解某些概念的內容。我很難從哪裏開始。

Eventhough的Help明確規定:

問題,要求我們建議還是找一本書,工具,軟件庫,教程等客上門資源是題外話堆棧溢出,因爲它們傾向於吸引自以爲是的答案和垃圾郵件。相反,請描述問題以及到目前爲止解決問題所做的工作。

我不認爲Asp.Net Website將很快消失,因此該鏈接應該在未來幾年內有效。

最後,與許多其他技術一樣,當前的ASP.Net Identity (Security Framework)不是特定於MVC,因此如果上下文與MVC無關,某些示例可能沒有意義。

4

您遇到的困惑很可能是由於ASP.NET經歷了不同身份驗證系統的數量。您擁有ASP.NET Auth,SimpleMembership,它實際上只是ASP.NET Auth之上的一層,現在是Identity。由於您使用的是MVC 5,因此您應該使用Identity。這是對ASP.NET進行自上而下的認證重寫,比以前的認證迭代功能更加強大和可擴展。

如果您剛剛開始,最好的選擇就是從Identity示例項目開始。在Visual Studio中創建一個新的空MVC 5應用程序,然後運行程序包管理器控制檯執行以下操作:

Install-Package Microsoft.AspNet.Identity.Samples -Pre 

這將安裝很多其他的NuGet包,給你一個非常功能完整的認證流程,包括外部「社交」登錄提供商,電子郵件確認,密碼重置,雙因素身份驗證等。

但是,請勿將此應用程序構建爲此示例項目。您將對應用程序的所有代碼進行更改,並且您不希望示例Nuget包受到阻礙。只需使用此項目作爲指導,您可以將相關代碼複製並粘貼到您的應用程序中,同時進行必要的修改。你也不必採取一切。如果您不想使用雙因素認證,請將其留下。就像我說的那樣,把它當作一個指南。