Asp.net mvc 4 ASP.NET用户登录

Asp.net mvc 4 ASP.NET用户登录,asp.net-mvc-4,login,identity,Asp.net Mvc 4,Login,Identity,我创建了一个简单的ASP.Net应用程序,其中包含一个数据库,该数据库由诸如班级、家长、学生、科目和教师等表组成 将有两个实体通过登录与此应用程序交互,这两个实体将是教师和家长 我的问题是如何链接我的教师表中的教师,而不是保存每个在AspNetUsers表中注册的新用户,该表附带AspNetIdentity 一旦教师/家长登录,我希望能够显示与该教师/家长相关的详细信息。例如,当一名教师登录时,我想显示他/她所教的、我从数据库中检索的所有课程 我是ASP.NET MVC的新手,所以如果我问了一些

我创建了一个简单的ASP.Net应用程序,其中包含一个数据库,该数据库由诸如班级、家长、学生、科目和教师等表组成

将有两个实体通过登录与此应用程序交互,这两个实体将是教师和家长

我的问题是如何链接我的教师表中的教师,而不是保存每个在AspNetUsers表中注册的新用户,该表附带AspNetIdentity

一旦教师/家长登录,我希望能够显示与该教师/家长相关的详细信息。例如,当一名教师登录时,我想显示他/她所教的、我从数据库中检索的所有课程

我是ASP.NET MVC的新手,所以如果我问了一些非常明显的问题,我会表示同意。任何帮助都将被告知

更新

好的,在Chris建议从应用程序用户继承之后,我设法更新了我的数据库,现在我的数据库有以下结构

现在我对父表教师表的位置有点困惑,如果这些实体都在一个表中“AspNetUsers”,我将如何准确地从数据库中检索这些实体

更新2

我的AccountController中有这段代码

public AccountController()
            : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
        {
        }

        public AccountController(UserManager<ApplicationUser> userManager)
        {
            UserManager = userManager;
        }

        public UserManager<ApplicationUser> UserManager { get; private set; }
publiccountcontroller()
:此(新的UserManager(新的UserStore(新的ApplicationDbContext()))
{
}
公共帐户控制器(用户管理器用户管理器)
{
UserManager=UserManager;
}
公共用户管理器用户管理器{get;private set;}
这就是Register()方法的外观:

if (ModelState.IsValid)
            {
                var user = new ApplicationUser() { UserName = model.UserName, FirstName = model.FirstName, LastName = model.LastName };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    var Teacher = new Teacher
                    {
                        UserName = model.UserName,
                        FirstName = model.FirstName,
                        LastName = model.LastName,
                    };

                    // Add the Address properties:
                    user.UserName = model.UserName;
                    user.FirstName = model.FirstName;
                    user.LastName = model.LastName;

                    var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
                    var roleManager = new RoleManager<IdentityRole>(roleStore);
                    await roleManager.CreateAsync(new IdentityRole("Teacher"));

                    await UserManager.AddToRoleAsync(user.Id, "Teacher");

                    await SignInAsync(user, isPersistent: false);
                    return RedirectToAction("Index", "Home");
                }
if(ModelState.IsValid)
{
var user=new ApplicationUser(){UserName=model.UserName,FirstName=model.FirstName,LastName=model.LastName};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
var教师=新教师
{
用户名=model.UserName,
FirstName=model.FirstName,
LastName=model.LastName,
};
//添加地址属性:
user.UserName=model.UserName;
user.FirstName=model.FirstName;
user.LastName=model.LastName;
var roleStore=new roleStore(new ApplicationDbContext());
var roleManager=新roleManager(roleStore);
等待roleManager.CreateAsync(新标识符(“教师”);
等待UserManager.AddToRoleAsync(user.Id,“Teacher”);
等待信号同步(用户,ispersist:false);
返回重定向到操作(“索引”、“主页”);
}

请参阅Chris comment,当新用户注册为新教师时,我如何设置ApplicationUserManager的实例?

由于您使用的是AspNetIdentity,您必须稍微更改存储机制才能真正利用AspNetIdentity。简单的是,所有这些实体(教师/家长)需要身份验证或需要经历登录过程的用户应保存在AspNetusers表中,以利用AspNetIdnetity身份验证过程的默认机制生成声明。如果存储用户详细信息(要验证的用户)在自定义表中,而不是AsNetIdentity的默认表中,它将没有跟踪机制

将有两个实体通过与此应用程序交互 教师和家长将在其中签名

教师和家长将拥有许多公共属性,如firstName、LastName、mobileNumber等,这些属性非常适合存储在AspNetUsers表中,并在AspNetIdentity的身份验证过程后作为声明获取

例如,当老师登录时,我想显示所有的班级 他/她教授我从数据库检索的内容


为此,您必须从
AspNetUser
的表中获取外键标识存在的全部原因之一是为了通过身份验证实现可扩展性。否则,我们可能都只能使用旧的ASP.NET成员身份。因此,请使用它。处理此问题的最佳方法是通过继承。您的基本“用户”将是
ApplicationUser
,并且“用户”的任何和所有子类型都应从中继承:

public class Teacher : ApplicationUser

public class Parent : ApplicationUser
默认情况下,这将导致单表继承,其中
ApplicationUser
的所有子类型的所有属性都将进入同一个表,即默认情况下
AspNetUsers
。将添加一个鉴别器列,其中将包含当记录为q时应实例化的类实体框架的值从数据库查询,即
教师
家长
,或
应用程序用户
。在大多数情况下,这很有效。唯一需要注意的一点是,由于子类型的所有属性都在一个表中,因此这些类型上不能有不可为空的属性。例如,如果
T上有一些属性您希望在数据库级别强制执行的每个
始终有一个值,您不能这样做,因为
Parent
ApplicationUser
无法提供值。但是,您可以始终在UI级别要求值,而不是在数据库上

如果这是完全不可接受的,您可以改为使用每种类型的表继承。使用该策略,除了
AspNetUsers
表之外,您将为
Parent
Teacher
创建单独的表。但是,只有该类型特有的属性才会出现在这些表上。
App上的所有属性ApplicationUser
将留在
AspNetUsers
中,一对一将是
public class ApplicationUserManager<TUser> : UserManager<TUser>
    where TUser : ApplicationUser