在现有Web应用程序中实现ASP.NET标识

时间:2015-12-16 10:43:18

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

阅读lots of articles并进行大量错误启动后,我需要建议将 Microsoft ASP.NET Identity 添加到现有的ASP.NET中Web窗体应用程序。我现有的应用程序和典型的样本之间有很多细微的差别,我不知道如何开始。以下是关于我现有应用程序的一些观点:

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

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

      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]
      

1 个答案:

答案 0 :(得分:2)

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

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

对问题2的回答:由于ASP.NET成员身份和ASP.NET身份是两回事,我建议进行完全迁移,这意味着一旦为Identity创建了新表,就可以将外键映射到新表并摆脱ASP.NET成员资格表。

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

对问题6的回答:如果不使用异步,则不会引起问题。唯一的缺点是你不会从中受益......

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

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