Asp.net mvc 5 了解Asp.Net身份关键点

Asp.net mvc 5 了解Asp.Net身份关键点,asp.net-mvc-5,entity-framework-6,asp.net-identity-2,Asp.net Mvc 5,Entity Framework 6,Asp.net Identity 2,我是一名Asp.net开发人员,但对Asp.net身份框架非常陌生。我一直在研究这个示例应用程序,也学习了一些关于身份的教程,但我仍然不能完全掌握这个概念。我对Asp.net成员身份有着非常坚定的控制,但身份似乎与成员身份完全不同。我将解释我迄今为止所做的工作 我正在创建一个简单的应用程序,其中我遵循代码优先的方法。我已经为用户创建了实体模型,该模型继承自IdentityUser,并有一些额外的字段。下面是用户的实体模型 public class User : IdentityUser {

我是一名Asp.net开发人员,但对Asp.net身份框架非常陌生。我一直在研究这个示例应用程序,也学习了一些关于身份的教程,但我仍然不能完全掌握这个概念。我对Asp.net成员身份有着非常坚定的控制,但身份似乎与成员身份完全不同。我将解释我迄今为止所做的工作

我正在创建一个简单的应用程序,其中我遵循代码优先的方法。我已经为用户创建了实体模型,该模型继承自IdentityUser,并有一些额外的字段。下面是用户的实体模型

public class User : IdentityUser
{
    public int? CompanyID { get; set; }

    public bool? CanWork { get; set; }

    public bool? CanSearch { get; set; }

    public Company Company { get; set; }
}
现在在示例中,人们使用名称ApplicationUser,但出于我自己的目的,我使用了名称User。用户或应用程序用户模型中还有一种方法

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
    {
        CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
我知道添加了一个额外的字段,但我无法理解重载构造函数的用途

上述混淆是次要的。我的主要困惑是,我很熟悉,当我创建实体模型时,我使用DbSet和DbContext,当我调用任何实体框架方法来访问数据库时,无论我遵循哪个方案,都会创建/删除数据库

在Identity中,哪个方法负责在数据库中创建Identity表?我有一个IdentityConfig文件,在其中声明ApplicationUserManager和ApplicationSignInManager。我还有一个启动文件。以前,我在App_Start文件夹中只有一个启动文件,当我运行应用程序并尝试访问任何标识方法时,它给了我错误,并且没有创建数据库。然后我将该类设置为partial,并在根目录下创建了另一个同名的partial类,然后异常消失并创建了表。那么Startup类负责创建标识表吗?AspNetUsers中会自动创建额外的列,如PhoneNumber、PhoneNumber确认、TwoFactorEnabled。我不需要这些额外的栏目。我能把这些拿走吗?我可以更改创建的标识表的名称吗


我知道这些都是非常基本的问题,不是一个问题,但如果我找不到一些基本的教程或初学者的例子,这将是非常有益的。我所发现的是描述那些我不需要的东西,或者让我感到困惑。我想了解并控制身份在我的应用程序中应该如何工作,但到目前为止,我似乎还没有完全掌握它,也无法根据我的需要进行调整。就像教程和例子教我如何造句,但我无法理解字母表(

首先,您必须定义模型——正如您所做的那样——实现正确的接口。
假设您要为应用程序创建一个用户:

public class MyUser : IdentityUser<string, MyUserLogin, MyUserRole, MyUserClaim>
{
    public string CompanyName { get; set; }
}
我为管理属于某个角色的用户定义了一个类型和类

public class MyUserRole : IdentityUserRole<string>
{
}
我们再次定义了要使用的用户、角色、登录名等。
我们需要
UserStore
因为我们的UserManager需要一个

如果您计划管理角色并将角色与每个用户关联,则必须创建
RoleStore
定义

public class MyRoleStore : RoleStore<MyRole, string, MyUserRole>
{
    public DaufRoleStore(ApplicationDatabaseContext context) : base(context)
    {
    }
}
此类有一个静态方法,它将为您创建一个新的UserManager。
有趣的是,您可以包括一些验证密码等可能需要的验证规则

最后一件事是创建一个或多个数据库上下文

public class MyContext : IdentityDbContext<MyUser, MyRole, string, MyUserLogin, MyUserRole, MyUserClaim>
{
    public MyContext(): base("<your connection string here>")
    {

    }

    public static MyContext Create()
    {
        return new MyContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<MyUser>()
            .ToTable("Users");

        modelBuilder.Entity<MyRole>()
            .ToTable("Roles");

        modelBuilder.Entity<MyUserRole>()
            .ToTable("UserRoles");

        modelBuilder.Entity<MyUserClaim>()
            .ToTable("UserClaims");

        modelBuilder.Entity<MyUserLogin>()
            .ToTable("UserLogins");
    }
}
现在,您应该有一个startup类,用于引导您的东西:

[assembly: OwinStartup(typeof(ASPNETIdentity2.Startup))]

namespace ASPNETIdentity2
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext(MyContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        }
    }
}
这是必需的,因为您要告诉您的环境,这是需要在启动时调用的启动类

现在,在控制器中,您只需参考您的
UserManager
即可执行以下操作:

HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
它将在名为
Migrations
的新文件夹中创建一个文件
Configuration.cs
如果要创建数据库,需要打开该文件并将
AutomaticMigrationsEnabled
更改为true:

public Configuration()
{
    AutomaticMigrationsEnabled = true;
}
同样,从
软件包管理器控制台
,您可以运行:

Update-Database
所有的表都将显示在数据库中。不要忘记连接字符串

您可以下载此文件以查看一切工作方式。
你可以用一些其他信息来检查这些

这两个人的博客上有一些链接,你可以在那里学到所有这些东西

注意:


如果你想定制你环境中的每一个细节,你必须完成所有这些工作。

哇。谢谢。你所做的细节非常容易理解,我真的很感谢你的努力。它简洁而又完整地描述了所有的事情。祝你过得愉快。很高兴我在某种程度上提供了帮助。祝你好运。我并不特别喜欢那些乱七八糟的东西,但我不喜欢它事情就是这样,干杯。
public DbSet<MyCustomer> Customers{ get; set; }
public static MyContext Create()
{
    return new MyContext();
}
[assembly: OwinStartup(typeof(ASPNETIdentity2.Startup))]

namespace ASPNETIdentity2
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext(MyContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        }
    }
}
[assembly: OwinStartup(typeof(ASPNETIdentity2.Startup))]
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
Enable-Migrations
public Configuration()
{
    AutomaticMigrationsEnabled = true;
}
Update-Database