我的主应用程序数据库中已经有一个User
表,其中包含一个电子邮件地址(用作用户名)和密码。我想使用我的数据库而不是默认的身份验证数据库(ASPNETDB)进行身份验证。
问题:
这是个坏主意吗?使用我自己的数据库进行身份验证是否是一大堆蠕虫?
通过这样做我加了多少工作?我已经有用于散列密码的代码和一个检查电子邮件和密码是否与数据库匹配的查询。所以,我不会从头开始。
使用我的数据库而不是ASPNETDB需要做什么?我希望可以通过几个简单的步骤来描述,但如果没有,你能指出我的好消息吗?
更新
我在第三个问题上仍在寻找更多细节。我是否需要自己编写MembershipProvider
?我需要对web.config文件进行哪些更改?如果我编写自己的解决方案,[Authorize]
属性是否仍然有效?我可以使用自动生成的AccountController进行一些小修改,还是我基本上需要从头开始重写帐户控制器?
答案 0 :(得分:16)
这很简单,您需要派生成员资格提供程序并实现ValidateUser方法。看一下这个post。我正在使用Postgres和MVC的自定义会员提供商。
答案 1 :(得分:13)
我会回答您更新的问题:
我是否需要编写自己的MembershipProvider?
如果您(a)想要继续使用表单身份验证,并且(b)具有不遵循与ASPNETDB相同的约定的授权表结构,那么是。如果你不需要FormsAuth(见下文),那么你可以完全取消MembershipProvider
,但我不推荐它。或者,如果您使用与ASPNETDB完全相同的安全表,但只想将其指向其他数据库,则可以继续使用默认提供程序,只需更改其配置。
我需要对web.config文件进行哪些更改?
如果您使用自己的自定义MembershipProvider
,则需要在<providers>
元素的<membership>
部分注册它并更改defaultProvider
属性。如果您使用标准AspNetSqlProvider
,那么您可能只需要更改连接字符串。
如果我编写自己的解决方案,[Authorize]属性是否仍然有效?
是的,如果您坚持使用表单身份验证(使用AspNetSqlProvider
或编写并注册您自己的成员资格提供程序)。不,如果您放弃表单身份验证(再次,不推荐)。
我可以使用自动生成的AccountController进行一些小修改,还是我基本上需要从头开始重写帐户控制器?
你应该重写AccountController
- 不要将演示代码留在生产应用程序中。但如果你必须 - 是的,AccountController
将在与上述相同的条件下工作。
答案 2 :(得分:1)
没有。而且我怀疑大多数人不相信这种肮脏的机制
一点都没有,特别是因为你已经有了这张桌子。
例如,请查看此内容:http://forums.asp.net/t/1250726.aspx
答案 3 :(得分:1)
我们正在其中一个应用程序中执行此操作,并且发现它非常简单。我们有一个身份验证服务(从控制器调用),它处理散列输入密码的机制以查看它是否匹配,然后只返回一个我们称之为“IsValidLogon”的方法的bool。
在我们的案例中,目的是尽可能轻松地管理应该是一项非常简单的任务。
我们完全忽略了ASPNETDB。如果我们从用户/密码检查中获得有效响应,我们只需调用标准FormsAuthentication.RedirectFromLoginPage(username,createCookieBool);
希望有所帮助。
答案 4 :(得分:1)
只是建立相同,所以答案1必须是NO :) 我正在使用标准的asp.net表单身份验证,我使用FormsAuthentication.RedirectFromLoginPage(username,createCookieBool)方法来记录用户。 我给了一个用户一个唯一的guid(你可以使用任何其他用户ID),我将它与用户名一起存储在UserName参数中(显示在主页面上:Html.Encode(Page.User.Identity.Name.Split) ( “|” .ToCharArray())[1]))
在每个控制器/方法中,我必须知道哪个用户登录(通过User.Identity.Name,拆分字符串并获取userguid)。 我也用[Authorize]属性装饰这些例程。
答案 5 :(得分:1)
嗨, 只需按照以下简单步骤操作:
首先,您可以删除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 Package Manager并编写以下命令:
Enable-Migrations
Add-Migration Init
Update-Database
检查您的数据库,所有带有Prefix Asp的ASP.NET成员资格表都已创建,然后您可以通过运行您的应用程序并执行成员资格操作(如注册或登录到您的应用程序)来测试它。
运行上述命令后创建表: