将 ASP.NET 身份实施到现有 Web 应用程序中

Implementing ASP.NET Identity into existing web application

阅读了 lots articles 并做了很多错误的开始,我需要一些关于将 Microsoft ASP.NET Identity 添加到我现有的 ASP.NET Web 的建议表格申请。我现有的应用程序与那里的典型示例之间存在如此多的细微差别,以至于我不知道如何着手。以下是我现有应用程序的一些要点:

  1. 它是一个 ASP.NET Web Forms 应用程序 (.NET Framework 4.6),已经发展了大约 4-5 年
  2. 它使用 SQL 服务器数据库,但 Entity Framework(不是代码优先,而是数据库优先)。该数据库早于 Web 应用程序,并且基于 10 年前的设计。然而,它确实有良好的 table 关系等
  3. 我的数据库的用户和角色架构未按照 "ASP.NET Identity / EntityFramework" 构建。它有一个 [User] table 和 ID int PK,没有用户名(如此)、密码、名字、姓氏、电子邮件和一些其他属性。它还具有一个角色 table(4-5 个条目)和一个提供多对多关系的用户角色 table。除了用户 table.
  4. 的属性外,没有 "claims" 本身
  5. 现有登录基于输入用户 ID(主键)和密码,然后根据用户 table 检查并成功登录(存储过程),然后将详细信息存储在 Session 中 - 这是本身就不太对!
  6. 虽然使用Entity Framework,但连接字符串是在运行时根据web.config中的模板连接字符串形成的(基本上,数据库名称和服务器实例名称是动态填充的)

所以,这是我遇到的一些障碍、问题和问题。对以下任何问题的任何建议将不胜感激:

  1. 当我的 Web 应用程序没有时,我应该使用 as "User.Username" 吗?我应该使用电子邮件地址还是用户 ID?不幸的是,电子邮件地址在现有 [User] 数据集中并不是唯一的。我应该使用我的 (int) UserID 的字符串版本吗?
  2. 我是否应该允许 ASP.NET Identity 先将自己的代码 table 设置到我自己的数据库中,然后将映射添加到我的遗留 [User] table?
  3. 如何注入 "resolver" 以向现有 ASP.NET 身份数据 Stored/Data 访问层提供(动态生成的)连接字符串?
  4. 我可能需要更换多少商店 类?
  5. 我读到不使用 ORM/EntityFramework 会提供非常低效的数据访问。这是否意味着如果实现我自己的存储 类,我不能简单地使用我现有的一些存储过程?
  6. 我的 Web 窗体应用程序没有使用任何 async 代码。这会导致 ASP.NET 身份框架出现问题吗?我听说 async 如果直接通过调用堆栈实现,效果最好。
  7. 我是否需要以某种方式禁用现有的基于表单的身份验证?例如,他们两个会因为写入 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]

这里有很多问题。我认为这篇迁移文章是一个很好的起点:Migrating an Existing Website from SQL Membership to ASP.NET Identity

它可能会帮助您回答此处的大部分问题,尤其是 1、3 和 4。

问题 2 的答案:由于 ASP.NET 成员资格和 ASP.NET 身份是两个不同的东西,我建议进行完全迁移,这意味着一旦您为身份创建了新表,您就可以映射您的新表的外键并删除 ASP.NET 个成员表。

问题 5 的答案:我认为这取决于您要如何设置 ASP.NET 身份。在我目前正在进行的项目中,我们决定根本不使用 Entity Framework,但这会使一切变得更加复杂,因为您必须非常深入地了解发生了什么、何时、如何、为什么……所以如果您正在寻找简单的实施方式,使用 EF 会让生活变得更加轻松,您会在 Internet 上找到大量代码示例。

问题 6 的答案:如果您不使用 async,则不会出现问题。唯一的缺点是您不会从中受益...

问题 7 的答案:Microsoft 不建议激活多个身份验证系统。在我目前从事的项目中,我们设法让 Identity 和 Azure AD 身份验证一起工作,但我们必须开发自己的中间件,这并不容易。在我们的 web.config 中,我们有:

<system.web>
    ...
    <authentication mode="None" />
    ...
</system.web>