【问题标题】:How to make Identity use of MVC instead of razor pages in asp.net core 2.2如何在 asp.net core 2.2 中使用 MVC 而不是 razor 页面的身份
【发布时间】:2019-04-01 17:21:41
【问题描述】:

自 asp.net core 2.1 起,MVC 不支持作为带有 Identity 的默认模型。我想在 asp.net core 2.2 中使用 MVC 运行 Identity

长话短说。这是一个带有本地数据库的 asp.net 4.6.2 站点,我想升级到 asp.net core 2.2 。我认为这将是简单的事情。我错了。那我做了什么:

  1. 使用本地身份创建了一个新的 ASP.net core 2.0 项目
  2. 首先使用 Scaffold-DbContext 将 ef 上下文与数据库搭建起来
  3. 已修复,以便在启动时正确加载 EF。
  4. 从 Scaffold-Dbcontext 生成的脚手架中删除了 aspnetusers、aspnetuserroles、aspnetuserlogin、aspnetroles 模型
  5. 将 ApplicationDbContext 更新为继承自 IdentityDbContext。 ApplicationUser 继承自 IdentityUser
  6. 在我假装迁移已应用后,我在 aspnetusers 中手动添加了以下列

6.1 并发标记

6.2 标准化用户名

6.3 标准化电子邮件

6.4 改名 LockoutEnd?到LockoutEnd

系统已构建,但我仍然无法使用 Account 控制器。我已按照https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2 中的步骤进行操作 无济于事。看来我所做的即使在我搭建了身份之后也无法让它读取 mvc 控制器。

我认为,在 asp.net core 2.X Identity 中,Identity 实现的差异对于早期的实现来说要么太高,要么太窄。

包含在我的启动中

       services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddIdentity<ApplicationUser, IdentityRole>()
            // services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddRazorPagesOptions(options =>
            {
                options.AllowAreas = true;
                //options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
                //options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
            });

        services.ConfigureApplicationCookie(options =>
        {
            options.LoginPath = $"/Account/Login";
            options.LogoutPath = $"/Account/Logout";
            options.AccessDeniedPath = $"/Account/AccessDenied";
        });

        // using Microsoft.AspNetCore.Identity.UI.Services;
        services.AddSingleton<IEmailSender, EmailSender>();
    }

我想将 MVC 与 Identity Core 2.2 与来自 Identity .Net 的旧数据库一起使用。

有什么建议吗?

【问题讨论】:

    标签: asp.net-core-mvc asp.net-core-identity asp.net-core-2.2


    【解决方案1】:

    不清楚您到底在做什么,但听起来您已经将 Identity Razor Pages 搭建到您的项目中。如果是这种情况,这些将优先于您的控制器,因为它是一条更物理的路线。

    所有其他代码看起来都不错。您使用的是AddIdentity 而不是AddDefaultIdentity(因此不包括默认用户界面)。假设您实际上已经创建了一个 AccountController 并且您的路由设置正确,那么它应该可以工作,只要您没有将默认 UI 物理地搭建到您的项目中。

    【讨论】:

    • 好的.. 这行得通,我会将其设置为答案。但是 Accountcontroller 需要位于名为 Identity 的区域才能工作。为什么我不知道,但它似乎是在最新的 Identity 核心中硬编码
    【解决方案2】:

    最近我也做了同样的事情。以下内容可能对您有所帮助。首先为所有 AspNet 表创建等效的 Application 表。下面的 MS SQL Server 脚本将创建:

    dbo.ApplicationRole
    dbo.ApplicationRoleClaim
    dbo.ApplicationUser
    dbo.ApplicationUserClaim
    dbo.ApplicationUserLogin
    dbo.ApplicationUserRole
    dbo.ApplicationUserToken
    
    1. 打开 MS SQL Server Management Studio
    2. 选择您的数据库
    3. 开始新查询
    4. 运行以下脚本并将 YOUR_DATABASE 替换为您的数据库名称
    5. 接下来,您应该将即将过时的 AspNet 表的内容复制到新的 Application 表中。在此过程中,您还应该处理 UserId 和 RoleId 的数据类型从 nvarchar 到 int 的更改。

    USE [YOUR_DATABASE]
    GO
    /****** Object:  Table [dbo].[ApplicationRole]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationRole](
        [Id] [int] NOT NULL,
        [Name] [nvarchar](256) NULL,
        [NormalizedName] [nvarchar](256) NULL,
        [ConcurrencyStamp] [nvarchar](max) NULL,
     CONSTRAINT [PK_ApplicationRoles] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[ApplicationRoleClaim]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationRoleClaim](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [RoleId] [int] NOT NULL,
        [ClaimType] [nvarchar](max) NULL,
        [ClaimValue] [nvarchar](max) NULL,
     CONSTRAINT [PK_ApplicationRoleClaims] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[ApplicationUser]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationUser](
        [Id] [int] NOT NULL,
        [UserName] [nvarchar](256) NULL,
        [NormalizedUserName] [nvarchar](256) NULL,
        [Email] [nvarchar](256) NULL,
        [NormalizedEmail] [nvarchar](256) NULL,
        [EmailConfirmed] [bit] NOT NULL,
        [PasswordHash] [nvarchar](max) NULL,
        [SecurityStamp] [nvarchar](max) NULL,
        [ConcurrencyStamp] [nvarchar](max) NULL,
        [PhoneNumber] [nvarchar](max) NULL,
        [PhoneNumberConfirmed] [bit] NOT NULL,
        [TwoFactorEnabled] [bit] NOT NULL,
        [LockoutEnd] [datetimeoffset](7) NULL,
        [LockoutEnabled] [bit] NOT NULL,
        [AccessFailedCount] [int] NOT NULL,
     CONSTRAINT [PK_ApplicationUsers] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[ApplicationUserClaim]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationUserClaim](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [UserId] [int] NOT NULL,
        [ClaimType] [nvarchar](max) NULL,
        [ClaimValue] [nvarchar](max) NULL,
     CONSTRAINT [PK_ApplicationUserClaims] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[ApplicationUserLogin]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationUserLogin](
        [LoginProvider] [nvarchar](128) NOT NULL,
        [ProviderKey] [nvarchar](128) NOT NULL,
        [ProviderDisplayName] [nvarchar](max) NULL,
        [UserId] [int] NOT NULL,
     CONSTRAINT [PK_ApplicationUserLogins] PRIMARY KEY CLUSTERED 
    (
        [LoginProvider] ASC,
        [ProviderKey] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[ApplicationUserRole]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationUserRole](
        [UserId] [int] NOT NULL,
        [RoleId] [int] NOT NULL,
     CONSTRAINT [PK_ApplicationUserRole] PRIMARY KEY CLUSTERED 
    (
        [UserId] ASC,
        [RoleId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    /****** Object:  Table [dbo].[ApplicationUserToken]    Script Date: 24-May-21 9:44:46 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ApplicationUserToken](
        [UserId] [int] NOT NULL,
        [LoginProvider] [nvarchar](128) NOT NULL,
        [Name] [nvarchar](128) NOT NULL,
        [Value] [nvarchar](max) NULL,
     CONSTRAINT [PK_ApplicationUserTokens] PRIMARY KEY CLUSTERED 
    (
        [UserId] ASC,
        [LoginProvider] ASC,
        [Name] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[ApplicationRoleClaim]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationRoleClaims_ApplicationRoles_RoleId] FOREIGN KEY([RoleId])
    REFERENCES [dbo].[ApplicationRole] ([Id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[ApplicationRoleClaim] CHECK CONSTRAINT [FK_ApplicationRoleClaims_ApplicationRoles_RoleId]
    GO
    ALTER TABLE [dbo].[ApplicationUser]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationUsers_Club] FOREIGN KEY([ClubId])
    REFERENCES [dbo].[Club] ([Id])
    GO
    ALTER TABLE [dbo].[ApplicationUser] CHECK CONSTRAINT [FK_ApplicationUsers_Club]
    GO
    ALTER TABLE [dbo].[ApplicationUserClaim]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationUserClaims_ApplicationUsers_UserId] FOREIGN KEY([UserId])
    REFERENCES [dbo].[ApplicationUser] ([Id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[ApplicationUserClaim] CHECK CONSTRAINT [FK_ApplicationUserClaims_ApplicationUsers_UserId]
    GO
    ALTER TABLE [dbo].[ApplicationUserLogin]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationUserLogins_ApplicationUsers_UserId] FOREIGN KEY([UserId])
    REFERENCES [dbo].[ApplicationUser] ([Id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[ApplicationUserLogin] CHECK CONSTRAINT [FK_ApplicationUserLogins_ApplicationUsers_UserId]
    GO
    ALTER TABLE [dbo].[ApplicationUserRole]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationUserRole_ApplicationRole] FOREIGN KEY([RoleId])
    REFERENCES [dbo].[ApplicationRole] ([Id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[ApplicationUserRole] CHECK CONSTRAINT [FK_ApplicationUserRole_ApplicationRole]
    GO
    ALTER TABLE [dbo].[ApplicationUserRole]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationUserRole_ApplicationUser] FOREIGN KEY([UserId])
    REFERENCES [dbo].[ApplicationUser] ([Id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[ApplicationUserRole] CHECK CONSTRAINT [FK_ApplicationUserRole_ApplicationUser]
    GO
    ALTER TABLE [dbo].[ApplicationUserToken]  WITH CHECK ADD  CONSTRAINT [FK_ApplicationUserTokens_ApplicationUsers_UserId] FOREIGN KEY([UserId])
    REFERENCES [dbo].[ApplicationUser] ([Id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[ApplicationUserToken] CHECK CONSTRAINT [FK_ApplicationUserTokens_ApplicationUsers_UserId]
    GO
    

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 2018-01-31
      • 2020-08-22
      • 2019-11-12
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2020-11-24
      • 2020-02-09
      相关资源
      最近更新 更多