此外,Scott Allen 在 Pluralsight 上的课程 "Building Applications withASP.NET MVC4" 也非常值得一看。
首先,将创建自定义域模型/数据库。在 "Model" 目录中,添加一个代表自定义 "User" 表的类。将其称为 "Administrator",如下所示:
namespace SimpleMembershipExample.Models
{
public class Administrator
{
public Administrator() {}
#region Fields and Properties
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
#endregion
}
}
然后,将在项目的根目录添加一个自定义的 DbContext,如下所示:
using System.Data.Entity;
using SimpleMembershipExample.Models;
namespace SimpleMembershipExample
{
public class SomeAppDbContext : DbContext
{
public SomeAppDbContext() : base(nameOrConnectionString: "SomeAppName") {}
public DbSet<Administrator> Administrators { get; set; }
}
}
DbContext 仅包含一个名为 Administrators 的表,以保持简单。数据库将包含更多内容。注意在自定义构造函数中,告诉 DbContext 使用特定的连接字符串。让将该连接字符串添加到 Web.Config 中。
移除 InitializeSimpleMembershipAttribute
Internet 模板包含一个名为 InitializeSimpleMembershipAttribute 的 Action 过滤器。删除了这个类并移除了所有引用它的地方。
用自定义用户实体替换 UserProfile
Internet 模板假设它将向数据库中添加一个名为 UserProfile 的用户表。认为大多数开发者想要使用他们自己的域模型的 "user" 实体,并让 SimpleMembership 仅管理密码。让演示如何做到这一点。
在 "Model" 文件夹中,在 AccountModel.cs 文件中,删除 UserProfile 类。想使用 Administrator 实体。在其他地方引用 UserProfile 的地方,用 Administrator 替换。原来的 UserProfile 有 UserName 和 UserId 属性。Administrator 有 Name 和 Id 属性。确保同步这些属性。
想只有一个 DbContext,并且想使用 DbContext。在 "Model" 文件夹中,在 AccountModel.cs 文件中,删除 UsersContext 类。在其他地方引用 UsersContext 的地方,用 SomeAppDbContext 替换。
调用 WebSecurity.InitializeDatabaseConnection
最后,在 Global.asax.cs 中,放入以下代码:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
SomeAppDbContext dbcontext = new SomeAppDbContext();
dbcontext.Administrators.All(i => i.Name != "Dan");
WebSecurity.InitializeDatabaseConnection(
"SomeAppName",
"Administrators",
"Id",
"Name",
autoCreateTables: true);
}
}
WebSecurity.InitializeDatabaseConnection 接受 web.config 连接字符串名称、自定义用户表的名称("Administrators")、用户表的唯一标识字段名称("Id")和用户名字段。运行 InitializeDatabaseConnection 方法会执行以下操作:
当运行这些更改后的代码时,将创建以下数据库:
主屏幕看起来像这样:
点击右上角的注册链接。填写表单并点击 "注册" 按钮。MVC 4Internet 模板应用程序将引导回到主页。
注意它知道注册的名字。如果检查 cookies,将看到典型的 ASPXAUTH,如下所示:
如果点击 "注销" 链接并检查 cookies,ASPXAUTH cookie 会消失。ASPXAUTH cookie 是认证的关键。
当查看数据库时,将看到以下内容:
注意代码更改后,MVC Internet 模板知道要保存到自定义用户表 "Administrators"。密码保存在 webpages_Membership 表中,与 Administrators 表有外键关系。
如果查看系列文章中的前几篇,Administrator 实体看起来像这样:
using System;
using System.Runtime.Serialization;
using System.Collections.Generic;
namespace LobGame.Model
{
public class Administrator
{
public Administrator()
{
Applications = new List<Application>();
}
#region Fields and Properties
public Guid Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public List<Application> Applications { get; set; }
#endregion
}
}
using System;
using System.Runtime.Serialization;
using System.Collections.Generic;
namespace LobGame.Model
{
public class Administrator
{
public Administrator()
{
Applications = new List<Application>();
}
#region Fields and Properties
public int Id { get; set; }
public string Name { get; set; }
public string Mobile { get; set; }
public List<Application> Applications { get; set; }
#endregion
}
}