首页 > 解决方案 > ASP .NET Core 标识无法在 ASP .NET Core 5.0 Razor Pages Web 应用程序中正常工作

问题描述

我是 ASP .NET Core Identity 的新手,所以如果需要一些额外的信息来调查问题 - 请随时问我(Program.cs、Startup.cs 或其他一些信息)。

所以,我有 ASP .NET Core 5.0 Razor Pages Web 应用程序,我有:

扩展Microsoft.AspNetCore.Identity.IdentityUser的用户类:

public partial class User: IdentityUser<Int64>
{
    [Required]
    public string Surname { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public Int64 RoleId { get; set; }
    public virtual Role Role { get; set; }
}

扩展Microsoft.AspNetCore.Identity.IdentityRole的UserRole类:

public class UserRole : IdentityRole<Int64>
{
    [Required]
    public string Notes { get; set; }
}

DbContext 扩展了Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext

public partial class MyDbContext: IdentityDbContext<User, UserRole, Int64>
{
    public virtual DbSet<Some_other_class_in_MyDbContext> Some_other_class { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    { 
         
         ....
         
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //To get rid of an error - "The entity type 'IdentityUserLogin<long>' requires a primary key to be defined"
        base.OnModelCreating(modelBuilder);
        
        ....
        
    }
}

我已经搭建了默认的身份页面(注册、登录、用户数据编辑等),并添加了更多页面来显示一些与用户相关的图表。之后我简单地使用:

  1. Microsoft.AspNetCore.Identity.SignInManager用于登录、注销并检查用户是否已登录(PasswordSignInAsync()SignOutAsync()IsSignedIn()
  2. Microsoft.AspNetCore.Identity.UserManager创建用户,将用户分配给角色并获取当前用户(CreateAsync()AddToRoleAsync()GetUserId\GetUserAsync()

大多数功能使用Microsoft.AspNetCore.Mvc.Razor.ClaimsPrincipal User(该字段的注释是 -获取当前登录用户的 System.Security.Claims.ClaimsPrincipal)。而且我认为用户识别可以开箱即用。

但是,在为同时登录的不同用户(同一台 PC 上的多个浏览器或多台 PC 连接同一 Web 服务器)执行一些并发测试时,我遇到了用户识别问题。如果两个用户几乎同时登录到不同的登录帐户,他们可以在Microsoft.AspNetCore.Mvc.Razor.ClaimsPrincipal User变量中具有相同的值(身份系统将他们识别为同一用户)。我肯定知道,因为我的应用程序中的每个页面顶部都有用户名和姓氏。如果第二个用户(变量中的值不正确)刷新他当前所在的页面 - 他在变量中获得正确的值。很奇怪...

我的应用程序有 40 多个不同的页面。我什至无法想象我需要一些集合来为每个登录用户保留每个页面的当前状态。对我来说,这是一个巨大的矫枉过正——正如我之前所说,我希望 Identity 能够开箱即用。我的数据库中有几个表(AspNetRoleClaimsAspNetUserClaimsAspNetUserLoginsAspNetUserClaims),我希望这些表能够保存该系统正常工作所需的所有数据。

所以看起来我做错了什么。任何帮助表示赞赏。先感谢您。

标签: c#asp.net-coreasp.net-identity.net-5

解决方案


推荐阅读