在现有web应用程序中实现ASP.NET Identity
本文关键字:实现 ASP NET Identity 应用程序 web | 更新日期: 2023-09-27 18:27:09
我读了很多文章,也做了很多错误的开始,我需要一些关于将Microsoft ASP.NET Identity添加到我现有的ASP.NET Web Forms应用程序的建议。我现有的应用程序和典型的示例之间有太多细微的差异,以至于我不知道如何开始。以下是关于我现有应用程序的一些要点:
- 它是一个经过大约4-5年发展的ASP.NET Web窗体应用程序(.NET Framework 4.6)
- 它通过实体框架(不是代码优先,而是数据库优先)使用SQL Server数据库。该数据库早于web应用程序,基于已有10年历史的设计。然而,它确实具有良好的表关系等
- 我的数据库的用户和角色架构不是按照"ASP.NET Identity/EntityFramework"构建的。它有一个[用户]表,其中包含
ID int PK
,没有用户名(例如)、密码、名字、姓氏、电子邮件和其他一些属性。它还有一个Roles表(4-5个条目)和一个UserRoles表,该表提供了许多许多关系。除了User表中的属性之外,没有其他"声明" - 现有登录是基于输入用户id(主键)和密码,然后根据用户表进行检查,成功登录(存储过程)后,详细信息将存储在会话中——这本身就不太正确
- 虽然使用实体框架,但连接字符串是在运行时基于
web.config
中的模板连接字符串形成的(基本上,数据库名称和服务器实例名称是动态填充的)
所以,以下是我提出的一些障碍、问题和问题。对以下任何问题的任何建议都将不胜感激:
- 当我的web应用程序没有"用户名"时,我应该使用"用户名"吗?我应该使用电子邮件地址还是用户ID?不幸的是,电子邮件地址在现有的[用户]数据集中并不唯一。我应该使用字符串版本的(int)UserID吗
- 我是否应该允许ASP.NET Identity在自己的数据库中设置自己的代码优先表,然后向旧版[User]表添加映射
- 如何注入"解析器"以向现有的ASP.NET标识数据存储/数据访问层提供(动态生成的)连接字符串
- 我可能需要替换多少Store类
- 我读到过不使用ORM/EntityFramework会提供非常低效的数据访问。这是否意味着,如果实现我自己的存储类,我就不能简单地使用一些现有的存储过程
- 我的Web窗体应用程序没有使用任何
async
代码。这会给我的ASP.NET Identity框架带来问题吗?我听说async
如果直接通过调用堆栈实现,效果最好 - 我是否需要以某种方式禁用现有的基于表单的身份验证?例如,他们两个会因为给
HttpContext.User
写信而发生冲突吗
我的模式
CREATE TABLE [dbo].[User](
[ID] [int] IDENTITY(1,1) NOT NULL,
[OrganisationID] [int] NOT NULL,
[SaltHashPassword] [nvarchar](128) NOT NULL,
[FirstName] [nvarchar](64) NOT NULL,
[Surname] [nvarchar](64) NOT NULL,
[Email] [nvarchar](128) NULL,
--...
CONSTRAINT [PK_User] PRIMARY KEY NONCLUSTERED ([ID] ASC)
) ON [PRIMARY]
CREATE TABLE [dbo].[Roles](
[Role] [varchar](8) NOT NULL,
[Name] [varchar](32) NOT NULL,
[Description] [varchar](1000) NOT NULL,
[OrderNo] [tinyint] NOT NULL,
CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED ([Role] ASC)--...
CONSTRAINT [IX_Roles] UNIQUE NONCLUSTERED ([Role] ASC)--...
) ON [PRIMARY]
CREATE TABLE [dbo].[UserRole](
[UserID] [int] NOT NULL,
[Role] [varchar](8) NOT NULL,
CONSTRAINT [PK_UserRole] PRIMARY KEY CLUSTERED ([UserID] ASC,[Role] ASC)
) ON [PRIMARY]
这里有很多问题。我认为一个很好的起点是这篇迁移文章:将现有网站从SQL成员身份迁移到ASP.NET Identity
它可能会帮助你回答这里的大多数问题,尤其是1、3和4。
问题2的答案:由于ASP.NET Membership和ASP.NET Identity是两种不同的东西,我建议进行完全迁移,这意味着一旦为Identity创建了新表,就可以将外键映射到新表,并去掉ASP.NET Membership表。
问题5的答案:我认为这取决于您希望如何设置ASP.NET标识。在我目前正在进行的项目中,我们决定根本不使用实体框架,但这使一切变得更加复杂,因为你必须深入了解发生了什么,何时,如何,为什么。。。所以,如果你正在寻找简单的实现,使用EF,它会让生活变得更加轻松,你会在互联网上找到大量的代码示例。
回答问题6:如果你不使用async,它不会引起问题。唯一的缺点是你不会从中受益…
问题7的答案:Microsoft不建议激活多个身份验证系统。在我目前正在进行的项目中,我们设法让Identity和Azure AD身份验证协同工作,但我们必须开发自己的中间件,这并不是那么容易。在我们的web.config中,我们有:
<system.web>
...
<authentication mode="None" />
...
</system.web>