2010-01-13 25 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/