【问题标题】:Implementing ASP.NET Identity into existing web application在现有的 Web 应用程序中实现 ASP.NET Identity
【发布时间】:2015-12-16 10:43:17
【问题描述】:

阅读了 lots of articles 并做出了很多错误的开始,我需要一些建议来将 Microsoft ASP.NET Identity 添加到我现有的 ASP.NET Web 窗体应用程序中。我现有的应用程序和典型的示例之间有很多细微的差异,我不知道如何开始。以下是关于我现有应用程序的一些要点:

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

以下是我提出的一些障碍、问题和疑问。对于以下任何问题的任何建议将不胜感激:

  1. 当我的 Web 应用程序没有“User.Username”时,我应该使用“User.Username”吗?我应该使用电子邮件地址还是用户 ID?不幸的是,电子邮件地址在现有的 [User] 数据集中并不是唯一的。我应该使用我的 (int) UserID 的字符串版本吗?
  2. 是否应允许 ASP.NET Identity 将其自己的代码优先表设置到我自己的数据库中,然后将映射添加到我的旧 [User] 表?
  3. 如何注入“解析器”以向现有的 ASP.NET 标识数据存储/数据访问层提供(动态生成的)连接字符串?
  4. 我可能需要替换多少 Store 类?
  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]

【问题讨论】:

  • 你这里有 7 个问题,我觉得你的问题太宽泛了。
  • @DavidG:你说得对,一个 SO 线程有多个问题。我不确定如何解决这个问题,因为它是许多不同事物的组合,使我转换为 ASP.NET Identity 变得如此复杂。我将重新考虑如何向社区提出这个问题。干杯。

标签: c# entity-framework webforms asp.net-identity


【解决方案1】:

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

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

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

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

问题 6 的答案:如果你不使用异步,它不会导致问题。唯一的缺点是你不会从中受益......

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

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

【讨论】:

  • 感谢您的反馈@DotNetMatt。我知道它包含了很多问题,但我认为您已经给出了一些可供参考的建议。我需要一段时间来完成所有这些工作。非常感谢。
猜你喜欢
  • 2018-12-13
  • 2023-03-11
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
相关资源
最近更新 更多