设置 ASP.NET MembershipProvider





5.00/5 (3投票s)
从头开始。
介绍
ASP.NET 中的身份验证设置非常简单。只需添加 WebMatrix.WebData NuGet 包,您就可以访问现成的 SimpleMembershipProvider。但是,我总是会复制粘贴 ASP.NET MVC4 应用程序的 Internet 应用程序模板中的代码。在本文中,我想教您如何通过使用 WebSecurity 工具类来设置和使用 SimpleMembershipProvider。
本文假设您熟悉依赖项、依赖项注入和测试驱动开发等概念。
我们的应用程序
该应用程序将是一个系统,用户可以在其中跟踪他在不同项目上花费的时间。要记录工作时间,用户需要登录。该应用程序不能使用任何凭据使用。所以基本要求是。
- 用户需要凭据。
- 用户可以在应用程序中拥有不同的角色,例如经理或开发人员。
- 只有经理可以创建项目代码。
这些是我们应用程序的基本要求。
设置项目
让我们开始设置项目。我们将使用一个空的 ASP.NET MVC4 Web 应用程序来设置。我们将使用一个空项目,以便我们可以演示 SimpeMembershipProvider 的有效性。要使用 SimpleMembershipProvider,我们还需要添加 Entity Framework NuGet 包。我们将使用此包来设置我们的员工和部门。
- 创建一个空的 ASP.NET MVC4 应用程序。
- 添加 WebMatrix.WebData NuGet 包。
- 添加 Entity Framework Nuget 包。
- 添加一个 HomeController 和一个 Index 页面。
这些是我们可以在开始开发解决方案之前需要做的基础设置任务。
设置数据库
首先,我们将需要使用 Entity Framework 来设置我们的数据库。我们将创建两个包含员工和部门信息的简单类。在实体中,我们将使用数据注释来指定主键。我们还将设置我们的 DbContext
类,其中包含员工和部门的表或 DbSet。之后,我们将使用 NuGet 包管理器控制台中的“Enable-Migrations”命令为我们创建数据库。
员工类:
public class Employee
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Name { get; set; }
public Department Department { get; set; }
}
部门类。
public class Department
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }
public string Name { get; set; }
}
以及 ArticleContext
类:
public class ArticleContext : DbContext
{
public ArticleContext() : base("DefaultConnection")
{
}
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
}
通过为 Entity Framework 启用迁移,将生成一个配置类。每次编辑或向数据库添加实体时,都可以通过在包管理器控制台中运行“Add-Migration [更改名称]”和“update-database”命令来自动更新数据库。但是,这要求我们拥有 Web.config 文件中设置的“DefaultConnection
”连接字符串。我的看起来是这样的。
<add name="DefaultConnection"
connectionString="Server=(local)\SQLINSTANCE;Database=ArticleDB;
Integrated Security=true;" providerName="System.Data.SqlClient"/>
我们完成了以下任务。
- 我们已经使用必要的 NuGet 包设置了我们的项目。
- 我们已经为数据库创建了类并启用了迁移。
如果一切顺利,您的项目应该看起来像这样,并且数据库已创建,名称为“ArticleDb”。
WebSecurity 和单元测试
现在我们已经设置了我们的项目,我们可以开始为用户编写功能了。首先,我想多谈谈 WebSecurity 和 ASP.NET 成员资格提供程序。WebSecurity
是一个与 ASP.NET 成员资格提供程序交互的帮助类。WebSecurity
为我们提供了许多已实现的内置方法。例如:检查用户是否存在、登录用户、获取用户名等。但是,并非 WebSecurity 的所有功能都已实现。因为默认情况下,WebSecurity
使用 SimpleMembershipProvider
类。WebSecurity
也不支持角色。而这种功能对我们的应用程序至关重要。Roles
和静态 Roles
类的使用将在以后的博客中详细介绍。这是一个如何使用 WebSecurity
类的示例。
public ActionResult Login(Credentials credentials)
{
if (WebSecurity.UserExists(credentials.UserName))
{
WebSecurity.Login(credentials.UserName, credentials.Password);
}
else
{
this.ModelState.AddModelError("Username",
"The combination of username and password are incorrect!");
return View();
}
Redirect("~/");
}
正如您可能猜到的,这类代码将创建对 WebSecurity
类的依赖。我们不想创建这些依赖项,因为代码将无法验证。我是测试驱动开发的坚定信徒,我认为应该打破这些类型的依赖关系,以在您的代码中创建某种质量和可测试性。因为 WebSecurity
类是一个静态帮助程序,所以我们需要创建一个包装器。此包装器将实现一个具有与 WebSecurity
类相似或完全相同的操作的接口。然后,包装器类将将其操作委托给 WebSecurity
。
强制授权和配置
现在我们有了实体、数据库和可测试的代码,我们就可以开始添加功能了。但在这样做之前,我们需要为 WebSecurity 设置数据库连接,并且我们需要找到一种方法来仅允许拥有凭据的用户进入我们的系统。这些都是非常简单的任务。
配置数据库
要开始使用 WebSecurity,我们需要告诉 WebSecurity
哪个数据库包含用户信息。我们可以通过调用 InitializeDatabaseConnection
方法来实现。此方法有一些需要传递的参数。第一个参数是连接字符串的名称。第二个参数是存储我们员工或“UserProfiles”的表的名称。第三个参数是用户的标识符。第四个参数是用户名。最后一个参数是告诉 ASP.NET 成员资格继续为我们创建表。我们的初始化代码看起来是这样的。我们将通过在 Global.asax 中调用它来运行此代码。
public static class AuthConfig
{
public static void RegisterAuth()
{
if (!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection",
"Employees", "UserId", "Name", true);
if (!WebSecurity.UserExists("Admin"))
{
var anonymous = new { Address = "Somewherestreet" };
WebSecurity.CreateUserAndAccount("Admin", "$ecret01", anonymous);
}
}
}
}
强制授权
为了强制用户进行身份验证,我们需要向 ASP.NET 应用程序提供一些特定信息。我们需要在操作、控制器上使用 AuthorizationAttribute
,或者我们可以将该属性添加到全局过滤器。与其为每个控制器标记 Authorization 属性,不如将其添加到全局过滤器。这将允许我们拒绝所有未经授权的用户,并自动将他们重定向到登录页面。为了实现这一点,我们需要在 System.Web
命名空间中的 web.config 文件中添加几行配置。并且我们需要将 AuthorizeAttribute
添加到 FilterConfig
类中的全局过滤器。
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login/" timeout="2880" />
</authentication>
</system.web>
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
}
结论
完成上述任务后,您就可以开始使用 WebSecurity 的各种功能了。它只需要一些初始设置。在下一篇文章中,我们将介绍 WebSecurity 的基本操作。基本操作包括:登录和登出、添加具有其属性的新员工,以及更改和重置密码。
值得关注的点
- 全局过滤器允许您将
AuthorizationAttribute
添加到应用程序的每个请求。
历史
- 2013 年 6 月 16 日 - 初始设置。
- 2013 年 6 月 17 日 - 完成。