使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?
Posted
技术标签:
【中文标题】使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?【英文标题】:ASP.NET MVC authentication using custom database instead of ASPNETDB? 【发布时间】:2011-01-04 12:39:30 【问题描述】:我的主应用程序数据库中已经有一个User
表,其中包含一个电子邮件地址(将作为用户名)和一个密码。我想使用我的数据库而不是默认身份验证数据库 (ASPNETDB) 进行身份验证。
问题:
这是个坏主意吗?使用我自己的数据库进行身份验证是否是一大堆蠕虫?
这样做会增加多少工作量?我已经有用于散列密码的代码和一个检查电子邮件和密码是否与数据库匹配的查询。所以,我不会从头开始。
我需要做什么才能使用我的数据库而不是 ASPNETDB?我希望这可以通过几个简单的步骤来描述,但如果没有,您能否指出好的来源?
更新
我仍在寻找关于我的第三个问题的更多细节。我需要自己写MembershipProvider
吗?我需要对我的 web.config 文件进行哪些更改?如果我编写自己的解决方案,[Authorize]
属性是否仍然有效?我可以使用自动生成的 AccountController 进行一些小的修改,还是我基本上需要从头开始重写帐户控制器?
【问题讨论】:
【参考方案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包管理器,编写如下命令:
Enable-Migrations
Add-Migration Init
Update-Database
检查您的数据库,所有带有前缀 Asp 的 ASP.NET 成员表都已创建,然后您可以通过运行您的应用程序并执行成员资格操作(例如注册或登录到您的应用程序)对其进行测试。
运行上述命令后创建的表:
AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRoles AspNet 用户 __MigrationHistory来源:https://blogs.msmvps.com/marafa/2014/06/13/how-to-create-asp-net-mvc-authentication-tables-in-an-existing-database/
【讨论】:
【参考方案2】:很简单,你需要派生 MembershipProvider 并实现 ValidateUser 方法。看看这个post。我正在使用带有 Postgres 和 MVC 的自定义会员提供程序就好了。
【讨论】:
我在另一个***帖子中读到我们需要实现IActionFilter来进行自定义身份验证。哪种方法是正确的? @James FWIW 这是一个谷歌缓存链接:webcache.googleusercontent.com/…【参考方案3】:我会回答你更新的问题:
我需要编写自己的 MembershipProvider 吗?
如果您 (a) 想继续使用表单身份验证,并且 (b) 具有不遵循与 ASPNETDB 相同约定的授权表结构,那么可以。如果您不需要 FormsAuth(见下文),那么您可以完全取消 MembershipProvider
,但我不推荐它。或者,如果您使用与 ASPNETDB 完全相同的安全表,但只是想将其指向不同的数据库,则可以继续使用默认提供程序并简单地更改其配置。
我需要对我的 web.config 文件进行哪些更改?
如果您使用自己的自定义MembershipProvider
,则需要在<membership>
元素的<providers>
部分中注册它并更改defaultProvider
属性。如果您使用的是标准的AspNetSqlProvider
,那么您可能只需要更改连接字符串。
如果我编写自己的解决方案,[Authorize] 属性是否仍然有效?
是的,如果您坚持使用表单身份验证(使用 AspNetSqlProvider
或编写并注册您自己的会员提供商)。不,如果您放弃表单身份验证(同样,不推荐)。
我可以使用自动生成的 AccountController 并进行一些小的修改,还是我基本上需要从头开始重写帐户控制器?
无论如何,您都应该重写 AccountController
- 不要将演示代码留在生产应用程序中。但如果您必须 - 是的,AccountController
将在与上述相同的条件下工作。
【讨论】:
Authorize
属性还是UserAuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter
? Custom Membership 使用 custom SQL Server for Forms Auth
吗?也许custom Role Provider
?【参考方案4】:
只是构建相同的,所以对 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] 属性装饰这些例程。
【讨论】:
你是否在每个Controller中使用Custom Membership using custom SQL Server ?FormsAuthentication.RedirectFromLoginPage
b> 还是 过滤器 ?存储在UserName parameter
,哪个对象?【参考方案5】:
我们正在我们的一个应用程序中执行此操作,并且发现它非常简单。我们有一个身份验证服务(从控制器调用),它处理输入密码的哈希机制以查看它是否匹配,然后简单地为我们称为“IsValidLogon”的方法返回一个布尔值。
在我们的例子中,目的是尽可能轻量级地管理应该是非常微不足道的任务。
我们基本上完全忽略了 ASPNETDB。如果我们从用户/密码检查中得到有效响应,我们只需调用标准 FormsAuthentication.RedirectFromLoginPage(username, createCookieBool);
希望对您有所帮助。
【讨论】:
从每个控制器调用的身份验证服务 (IsValidLogon
) ? FormsAuthentication.RedirectFromLoginPage(username, createCookieBool);
在任何控制器中调用?【参考方案6】:
没有。而且我怀疑大多数人不相信这种肮脏的机制
一点也不多,尤其是你已经有桌子了。
看看这个例子:http://forums.asp.net/t/1250726.aspx
【讨论】:
感谢您的回答,但您对#3 的回答是关于使用 ASP.NET 网络表单而非 ASP.NET MVC 进行身份验证的论坛帖子。在 MVC 的过程中我需要注意哪些差异? MVC 和 webforms 的机制是一样的。以上是关于使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
Core Data 是不是比“as-you-type”搜索的自定义索引更有效?