📜  asp net identity 扩展关系 - C# (1)

📅  最后修改于: 2023-12-03 14:39:21.900000             🧑  作者: Mango

ASP.NET Identity 扩展关系 - C#

ASP.NET Identity 是 ASP.NET Core 中用于身份验证和访问授权的框架。这个框架可用于管理用户,角色和其他实体,并定义他们之间的关系。在本文中,我们将探讨如何扩展 ASP.NET Identity 的关系和在 ASP.NET Core 中如何使用它。

添加自定义关系

首先,让我们看看如何添加自定义关系。默认情况下,ASP.NET Identity 支持用户和角色之间的关系,并且在 ASP.NET Core 中定义为 IdentityUserRole, IdentityUserClaim, IdentityUserLogin, IdentityRoleClaimIdentityUserToken 五个类。

如果要定义自定义关系,则需要创建一个新的实体类并将其关联到其中一个默认类上。这需要以下步骤:

  1. 创建一个新的实体类,例如 PersonRole,它将包含用户和角色之间的关系。

    public class PersonRole
    {
        public string UserId { get; set; }
        public string RoleId { get; set; }
        public IdentityUser User { get; set; }
        public IdentityRole Role { get; set; }
    }
    
  2. PersonRole 类添加到应用程序的 DbContext 中。

    public class ApplicationDbContext : IdentityDbContext
    {
        public DbSet<PersonRole> PersonRoles { get; set; }
    }
    
  3. 通过对 ApplicationDbContext 进行自定义,将 PersonRole 类关联到默认的 ASP.NET Identity 类之一上,例如:

    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<PersonRole> PersonRoles { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<PersonRole>()
                .HasKey(pr => new { pr.UserId, pr.RoleId });
    
            modelBuilder.Entity<PersonRole>()
                .HasOne(pr => pr.User)
                .WithMany(u => u.PersonRoles)
                .HasForeignKey(pr => pr.UserId);
    
            modelBuilder.Entity<PersonRole>()
                .HasOne(pr => pr.Role)
                .WithMany(r => r.PersonRoles)
                .HasForeignKey(pr => pr.RoleId);
        }
    }
    
  4. 最后,在应用程序中使用新的 PersonRole 类。

    public class SomeController : Controller
    {
        private readonly ApplicationDbContext _context;
    
        public SomeController(ApplicationDbContext context)
        {
            _context = context;
        }
    
        public async Task<IActionResult> Index()
        {
            var personRoles = await _context.PersonRoles.ToListAsync();
            // do something
        }
    }
    
在 ASP.NET Core 中使用 ASP.NET Identity

现在,让我们看看如何在 ASP.NET Core 中使用扩展的 ASP.NET Identity。

首先,创建一个新的 ASP.NET Core Web 应用程序,启用身份验证,并将 ASP.NET Identity 添加到应用程序中。在 Startup.cs 文件中,可以找到此行代码以执行上述任务:

services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

现在,我们可以在 Controllers 和 Views 中使用 ASP.NET Identity,例如:

public class SomeController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly SignInManager<IdentityUser> _signInManager;

    public SomeController(
        UserManager<IdentityUser> userManager,
        SignInManager<IdentityUser> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    public async Task<IActionResult> Index()
    {
        var user = await _userManager.GetUserAsync(HttpContext.User);
        // do something
    }
}
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    <p>Hello, @UserManager.GetUserName(User)</p>
}
else
{
    <p>You are not signed in.</p>
}
总结

ASP.NET Identity 提供了一种灵活的方法来管理 ASP.NET Core 应用程序中的身份验证和访问授权。通过使用自定义关系,我们可以扩展其功能,从而管理用户和角色之间的其他关系。在 ASP.NET Core 中,可以通过注入 UserManagerSignInManager 来访问和操作 ASP.NET Identity。

以上就是本文介绍的全部内容,希望对你理解和使用 ASP.NET Identity 有所帮助!