c# – 正确使用Microsoft.AspNet.Identity 2.0

我使用MVC 5模板附带的身份验证方法丢失了.

我需要将CreateBy用户包含在一个称为客户端的实体中,所以经过一些研究,我来了:

模型:

[Table("Clients")]
public partial class Client
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public virtual int UserCreated_Id { get; set; }

    [ForeignKey("UserCreated_Id")]
    public virtual ApplicationUser UserCreated { get; set; }
}

控制器方式:

client.UserCreated_Id = User.Identity.GetUserId<int>();

但我不得不改变身份模型中的几乎所有内容:

public class ApplicationUser : IdentityUser

public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>

由于这个而差不多有30个变化.

但现在我有2个DbContext:

身份上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext() : base("IPDB") {}

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

我的应用程序上下文:

public class MyDbContext : DbContext
{
    public MyDbContext() : base("IPDB")
    {

        // Tells Entity Framework that we will handle the creation of the database manually for all the projects in the solution
        Database.SetInitializer<MyDbContext>(null);
    }

    public DbSet<Client> Clients { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // ANOTHER CHANGE I HAD TO MADE TO BE ABLE TO SCAFFOLDING
        modelBuilder.Entity<ApplicationUserLogin>().HasKey<int>(l => l.UserId);
        modelBuilder.Entity<ApplicationRole>().HasKey<int>(r => r.Id);
        modelBuilder.Entity<ApplicationUserRole>().HasKey(r => new { r.RoleId, r.UserId });
    }
}

我现在的问题是:

>我需要2个DbContext吗?
我是否正确地将用户与客户端实体相关联?
>我需要创建一个所有用户的列表,并附上信息,我将从2 DbContext中读取信息?

请,我需要一些明确的指导,因为我现在很困惑,我真的很喜欢构建伟大的代码,我认为不是这样.

ApplicationUser上的Id类型

ASP.NET Identity 2.0非常灵活,同时还提供了一些在默认情况下可以执行的默认实现. MVC 5模板在大多数地方使用默认实现,但在某些情况下,添加了一些额外的东西可以使自定义更容易.

内部ASP.NET身份始终使用IdentityUser< ...>.所有这些模板参数提供了一种选择自己的键类型的方法,这意味着您也必须选择自己的IdentityUserRole类型(包含键).

还有一个使用键的字符串的方便的默认实现.字符串的值是GUID的字符串表示形式.

public class IdentityUser : 
  IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
{
  /// <summary>
  /// Constructor which creates a new Guid for the Id
  /// </summary>
  public IdentityUser()
  {
    this.Id = Guid.NewGuid().ToString();
  }

将字符串作为数据库中的主键不是常见的,但对于安全敏感的东西,这是有道理的.数据库之间复制的数据不会有碰撞ID,给用户错误的风险.

在您的情况下,您需要选择:使用带有字符串PK的默认实现或将该ID更改为int.在后一种情况下,您必须在身份模型中更改“几乎所有内容”,就像您发现的那样.虽然我认为你可以不执行你自己的ApplicationRole.应该可以将ApplicationUser声明为

public class ApplicationUser: IdentityUser<int, IdentityUserLogin<int>, IdentityUserRole<int>....>

DbContexts

在大多数情况下,单个DbContext适用于应用程序.如果使用多个DbContexts,它们应该用于不相关的不同的不同数据集.当您将Client类设置为与ApplicationUser相关时,它们应该在同一个DbContext中.该模板尝试传达应用程序上下文的主要DbContext应该继承IdentityDbContext<>通过命名它ApplicationDbContext.使用那个,并用你自己的东西来扩展它.我通常会重命名它并将其移动到别的地方,但是我仍然有一个DbContext,并让它继承IdentityDbContext<>.

滚动您自己的身份解决方案

除非你真的,真的知道你在做什么 – 不要滚动你自己的身份解决方案.使用外部评论已经被安全加固的现有的.如果您对ASP.NET身份不满意,可以看看Brock Allen’s Identity reboot.

为了信誉(是的,我今天是一个赏金猎人):The official ASP.NET documentation链接到我的blog.

翻译自:https://stackoverflow.com/questions/34099482/correct-use-of-microsoft-aspnet-identity-2-0

转载注明原文:c# – 正确使用Microsoft.AspNet.Identity 2.0