2010-01-13 45 views
26

我的主應用程序數據庫中已經有一個User表,其中包含一個電子郵件地址(將用作用戶名)和一個密碼。我想使用我的數據庫而不是默認身份驗證數據庫(ASPNETDB)進行身份驗證。使用自定義數據庫而不是ASPNETDB的ASP.NET MVC身份驗證?

問題:

  1. 這是一個壞主意?使用我自己的數據庫進行身份驗證是否是一大堆蠕蟲?

  2. 通過這樣做我添加了多少工作?我已經有散列密碼的代碼和一個將檢查電子郵件和密碼是否與數據庫匹配的查詢。所以,我不會從頭開始。

  3. 我需要做什麼來使用我的數據庫,而不是ASPNETDB?我希望這可以通過幾個簡單的步驟來描述,但是如果沒有,你能指出我是否有很好的來源?

更新

我仍然在尋找一個更詳細一點上我的第三個問題在這裏。我需要寫我自己的MembershipProvider嗎?我需要對web.config文件進行哪些更改?如果我編寫自己的解決方案,[Authorize]屬性仍然可以工作嗎?我可以使用自動生成的AccountController進行一些小的修改,或者我基本上需要從頭開始重寫帳戶控制器嗎?

回答

16

這很簡單,你需要驅動MembershipProvider並實現ValidateUser方法。看看這個post。我使用Postgres和MVC的自定義成員資格提供程序就好了。

+4

您的鏈接已損壞。 – James 2014-08-25 12:29:25

+0

我在另一個stackoverflow文章中讀到我們需要實現IActionFilter來進行自定義身份驗證。這是正確的方法嗎? – James 2014-08-25 13:18:01

+0

@James FWIW這是一個谷歌緩存的鏈接:http://webcache.googleusercontent.com/search?q=cache:-Os-ZJxfa_QJ:www.hurryupandwait.io/blog/implementing-custom-membership-provider-and-角色提供商換認證-ASP淨MVC應用+ CD = 1&HL = EN&CT = clnk&GL =在 – Shrayas 2015-06-24 06:12:31

1
  1. 號,我會懷疑大多數人不相信,眉頭機制

  2. 沒有太多可言,特別是因爲你有表了。

  3. 看看這個,例如:http://forums.asp.net/t/1250726.aspx

+0

感謝您的回答,但您對#3的回答是關於使用ASP.NET webforms進行身份驗證的論壇帖子,而不是ASP.NET MVC。在MVC的過程中,我需要注意哪些差異? – devuxer 2010-01-13 18:04:38

+0

這對於MVC和webforms都是一樣的機制。 – UpTheCreek 2010-01-14 06:46:22

1

我們正在做的正是這一點在我們的應用程序之一,並發現它相當簡單。我們有一個身份驗證服務(由控制器調用)處理哈希輸入密碼的機制以查看它是否匹配,然後簡單地爲我們稱爲「IsValidLogon」的方法返回一個bool。

在我們的案例中,目的是讓管理層儘可能輕量化地完成一項非常簡單的任務。

我們完全忽略了ASPNETDB。如果我們從用戶/密碼檢查中得到有效的回覆,我們只需調用標準的FormsAuthentication.RedirectFromLoginPage(用戶名,createCookieBool);

希望有所幫助。

1

只是建立相同的,所以回答1必須是否:) 我使用標準的asp.net表單身份驗證,其中我使用FormsAuthentication.RedirectFromLoginPage(用戶名,createCookieBool)方法登錄用戶。 我給用戶一個獨特的GUID(你可以使用任何其他用戶ID),我將它與用戶名一起存儲在UserName參數中(要在主頁上顯示:Html.Encode(Page.User.Identity.Name。斯普利特( 「|」。ToCharArray())[1]))

在每個控制器/方法中,我必須知道哪個用戶登錄(通過User.Identity.Name,拆分字符串並獲取userguid)。 另外我用[Authorize]屬性來裝飾這些例程。

12

我來回答你的問題的更新:

我是否需要寫我自己的MembershipProvider?

如果您(a)想要繼續使用表單身份驗證,並且(b)有一個授權表結構不遵循與ASPNETDB相同的約定,那麼是的。如果你不需要FormsAuth(見下文),那麼你可以完全廢除MembershipProvider,但我不會推薦它。或者,如果您使用與ASPNETDB完全相同的安全表,但只是想將其指向另一個數據庫,則可以繼續使用默認提供程序並只更改其配置。

我需要對web.config文件進行哪些更改?

如果您正在使用自己的自定義MembershipProvider,那麼你需要在<membership>元素的<providers>部分進行註冊和更改defaultProvider屬性。如果您使用標準AspNetSqlProvider,那麼您可能只需更改連接字符串。

如果我寫自己的解決方案,[授權]屬性是否仍然有效?

是的,如果你堅持窗體身份驗證(無論是使用AspNetSqlProvider或寫並註冊自己的成員提供)。不,如果你放棄表單身份驗證(再次,不推薦)。

我可以使用自動生成的AccountController進行一些小的修改,或者我基本上需要從頭開始重寫帳戶控制器嗎?

無論如何,您應該重寫AccountController - 不要在演示程序中留下演示代碼。但是,如果您必須 - 是的,AccountController將在與上述相同的條件下工作。

0

嗨, 只要按照這些簡單的步驟:

首先,你可以刪除App_Data文件夾的.mdf文件。由於我們不需要這些表格中的任何一個。 然後,我們需要更新web.config中的默認連接字符串以指向我們的數據庫。

<connectionStrings> 
    <add name=」DefaultConnection」 connectionString=」Data Source=SERVER\INSTANCENAME;Initial Catalog=DBNAME;Integrated Security=True」 providerName=」System.Data.SqlClient」 /> 
    </connectionStrings> 

,打開NuGet包管理器,然後編寫以下命令:

Enable-Migrations 
Add-Migration Init 
Update-Database 

退房數據庫,以前綴天冬氨酸所有ASP.NET成員資格表已經創建,然後你可以測試通過運行您的應用程序並執行會員操作(例如註冊或登錄您的應用程序)。

上述命令運行之後創建的表:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers
  • __MigrationHistory

來源:https://blogs.msmvps.com/marafa/2014/06/13/how-to-create-asp-net-mvc-authentication-tables-in-an-existing-database/