首页 > 解决方案 > 使用自定义模型的基于身份的身份验证

问题描述

我正在尝试向 asp net core 3.1 应用程序添加身份验证。我有一个现有的数据库,我从那里生成了模型。主要限制是我与数据库结构相关联。

例如,这是我需要的用户模型。

 public partial class TFactoryWorker: IdentityUser
    {
        public int idPerson { get; set; }
        public string Code { get; set; }
        public int Token { get; set; }
}

想法如下,从IdentityUser继承模型(我在该模型中已经有用户名、电子邮件等)更新 DBContext 并自定义脚手架视图中的注册/登录字段。(https://docs.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-3.1)。

例如,我需要 FactoryWorker 使用令牌代码而不是电子邮件密码登录

这是一种可行的方法吗?

我还发现了这篇文章https://docs.microsoft.com/en-us/aspnet/core/security/authorization/secure-data?view=aspnetcore-3.1。这里它定义了一个带有与 AspNetUsers 表相关的 OwnerId 的联系人模型,因此原始实体(FactoryWorker)需要最小的更改(只需添加绑定到 aspNetUser 的 OwnerId)这里的重点是我需要添加身份验证而不修改现有的表。关于如何进行的任何建议或一些提示(我是所有这些东西的初学者,我对信息量感到不知所措......谢谢!)

标签: c#authenticationasp.net-identity

解决方案


我做了以下。

我创建了一个带有个人用户帐户的asp net core 应用程序,并进行了必要的更改以显示用户名字段而不是默认的电子邮件输入字段。(这只是自定义脚手架项目的输入模型和模板,用户现在使用用户名+密码登录)

然后在我的数据库中进行了一些更改。

在我的TFactoryWorker表中,我将Code字段设置为主键(这是一个唯一值,不能重复)。记住下面的模型

 public partial class TFactoryWorker
    {
        public int idWorker {get;}
        public string Code { get; set; }
        public int Token { get; set; }
    }

然后我有 AspNetUsers 表及其正确的字段(id、UserName、email 等)(这是通过migrations自动生成的),我在这个表中添加了一个从字段UserName到表 TFactoryWorker Code的外键。代码与UserName相同。

这样我就不必修改我现有的数据库。可能进行一些规范化以从 TFactoryWorker 表中删除一些冗余字段(此表包含电子邮件、电话和 AspNetUsers 中已经存在的一些其他字段)

缺点是我需要让每个用户在系统中再次注册,但使用他们在以前的应用程序中使用的用户名或代码。一旦他们在应用程序中注册,来自 aspNetUsers 的用户名与 TFactoryWorker 中代码中的现有值相同。

总结

我使用默认的身份验证并添加了一个外键,所以我不需要对其余表进行更改,TFactoryWorker 只是 AspNetUsers 表的一些附加数据,它们是由外键绑定的,所以如果我需要获取来自用户的一些信息,我可以通过一些连接来获取它。

我不确定这是否是正确的方法,但它对我有用。


推荐阅读