Добавление аутентификации идентификатора ASP.NET MVC5 в существующий проект

Я видел много похожих страниц в Интернете, но большинство из них используют новый проект вместо существующего или не имеют необходимых функций. Итак, у меня есть существующий проект MVC 5 и вы хотите интегрировать идентификатор ASP.NET MVC5 с регистрацией, подтверждениями по электронной почте и функциями сброса пароля .

В дополнение к этому, мне также необходимо создать все необходимые таблицы в базе данных, например «Пользователь, роли, группы» и т. Д. (Я использую EF Code First в своем проекте). Есть ли статья или образец, соответствующий этим потребностям? Любое предложение будет оценено по достоинству. Заранее спасибо…

Настройка Identity для вашего существующего проекта – это не сложно. Вы должны установить пакет NuGet и выполнить небольшую конфигурацию.

Сначала установите эти пакеты NuGet в консоли диспетчера пакетов:

 PM> Install-Package Microsoft.AspNet.Identity.Owin PM> Install-Package Microsoft.AspNet.Identity.EntityFramework PM> Install-Package Microsoft.Owin.Host.SystemWeb 

Добавьте class пользователя и с наследованием IdentityUser :

 public class AppUser : IdentityUser { //add your custom properties which have not included in IdentityUser before public string MyExtraProperty { get; set; } } 

Сделайте то же самое для роли:

 public class AppRole : IdentityRole { public AppRole() : base() { } public AppRole(string name) : base(name) { } // extra properties here } 

Измените родительскую форму DbContext на IdentityDbContext следующим образом:

 public class MyDbContext : IdentityDbContext { // Other part of codes still same // You don't need to add AppUser and AppRole // since automatically added by inheriting form IdentityDbContext } 

Если вы используете ту же строку соединения и активировали миграцию EF, создайте для вас необходимые таблицы.

При желании вы можете UserManager чтобы добавить необходимую конфигурацию и настройку:

 public class AppUserManager : UserManager { public AppUserManager(IUserStore store) : base(store) { } // this method is called by Owin therefore best place to configure your User Manager public static AppUserManager Create( IdentityFactoryOptions options, IOwinContext context) { var manager = new AppUserManager( new UserStore(context.Get())); // optionally configure your manager // ... return manager; } } 

Поскольку Identity основана на OWIN, вам также необходимо настроить OWIN:

Добавьте class в папку App_Start (или где-нибудь еще, если хотите). Этот class используется OWIN

 namespace MyAppNamespace { public class IdentityConfig { public void Configuration(IAppBuilder app) { app.CreatePerOwinContext(() => new MyDbContext()); app.CreatePerOwinContext(AppUserManager.Create); app.CreatePerOwinContext>((options, context) => new RoleManager( new RoleStore(context.Get()))); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Home/Login"), }); } } } 

Почти просто добавьте эту строку кода в файл web.config чтобы OWIN мог найти ваш class запуска.

     

Теперь во всем проекте вы можете использовать Identity, как и новый проект, уже установленный VS. Рассмотрите действие входа в систему, например

 [HttpPost] public ActionResult Login(LoginViewModel login) { if (ModelState.IsValid) { var userManager = HttpContext.GetOwinContext().GetUserManager(); var authManager = HttpContext.GetOwinContext().Authentication; AppUser user = userManager.Find(login.UserName, login.Password); if (user != null) { var ident = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); AuthManager.SignIn( new AuthenticationProperties { IsPersistent = false }, ident); return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home")); } } ModelState.AddModelError("", "Invalid username or password"); return View(login); } 

Вы можете создавать роли и добавлять к своим пользователям:

 public ActionResult CreateRole(string roleName) { var roleManager=HttpContext.GetOwinContext().GetUserManager>(); if (!roleManager.RoleExists(roleName)) roleManager.Create(new AppRole(roleName)); // rest of code } 

Вы можете добавить любую роль к любому пользователю:

 UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName"); 

Используя Authorize вы можете защитить свои действия или controllerы:

 [Authorize] public ActionResult MySecretAction() {} 

или

 [Authorize(Roles = "Admin")]] public ActionResult MySecretAction() {} 

Также вы можете установить дополнительный пакет и настроить их в соответствии с вашими требованиями, такими как Microsoft.Owin.Security.Facebook или в зависимости от того, что вы хотите.

Примечание. Не забудьте добавить соответствующие пространства имен в ваши файлы:

 using Microsoft.AspNet.Identity; using Microsoft.Owin.Security; using Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Owin; 

Вы также можете увидеть мои другие ответы, подобные этому, и это для расширенного использования Identity.

Это то, что я сделал для интеграции Identity с существующей базой данных.

  1. Создайте образец MVC-проекта с шаблоном MVC. У этого есть весь код, необходимый для реализации Identity – Startup.Auth.cs, IdentityConfig.cs, Код Контроля Пользователя, Управление Контроллером, Модели и связанные с ними взгляды.

  2. Установите необходимые пакеты nuget для Identity и OWIN. Вы получите представление, увидев ссылки в примере проекта и ответ by @Sam

  3. Скопируйте весь этот код в существующий проект. Обратите внимание, что не забудьте добавить строку подключения «DefaultConnection» для Identity для сопоставления с вашей базой данных. Проверьте class ApplicationDBContext в IdentityModel.cs, где вы найдете ссылку на строку подключения «DefaultConnection».

  4. Это SQL-скрипт, который я запускал в моей существующей базе данных для создания необходимых таблиц:

     USE ["YourDatabse"] GO /****** Object: Table [dbo].[AspNetRoles] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetRoles]( [Id] [nvarchar](128) NOT NULL, [Name] [nvarchar](256) NOT NULL, CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUserClaims] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUserClaims]( [Id] [int] IDENTITY(1,1) NOT NULL, [UserId] [nvarchar](128) NOT NULL, [ClaimType] [nvarchar](max) NULL, [ClaimValue] [nvarchar](max) NULL, CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUserLogins] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUserLogins]( [LoginProvider] [nvarchar](128) NOT NULL, [ProviderKey] [nvarchar](128) NOT NULL, [UserId] [nvarchar](128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED ( [LoginProvider] ASC, [ProviderKey] ASC, [UserId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUserRoles] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUserRoles]( [UserId] [nvarchar](128) NOT NULL, [RoleId] [nvarchar](128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED ( [UserId] ASC, [RoleId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUsers] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUsers]( [Id] [nvarchar](128) NOT NULL, [Email] [nvarchar](256) NULL, [EmailConfirmed] [bit] NOT NULL, [PasswordHash] [nvarchar](max) NULL, [SecurityStamp] [nvarchar](max) NULL, [PhoneNumber] [nvarchar](max) NULL, [PhoneNumberConfirmed] [bit] NOT NULL, [TwoFactorEnabled] [bit] NOT NULL, [LockoutEndDateUtc] [datetime] NULL, [LockoutEnabled] [bit] NOT NULL, [AccessFailedCount] [int] NOT NULL, [UserName] [nvarchar](256) NOT NULL, CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[AspNetUserClaims] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] GO ALTER TABLE [dbo].[AspNetUserLogins] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] GO ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] GO ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] GO 
  5. Проверьте и устраните все оставшиеся ошибки, и все готово. Идентичность справится с остальными 🙂

Я рекомендую IdentityServer. Это проект .NET Foundation и охватывает многие проблемы аутентификации и авторизации.

обзор

IdentityServer – это основанная на .NET / Katana инфраструктура и хост-компонент, который позволяет реализовать единый вход и контроль доступа для современных веб-приложений и API-интерфейсов с использованием таких протоколов, как OpenID Connect и OAuth2. Он поддерживает широкий спектр клиентов, таких как мобильные, веб-сайты, SPA и настольные приложения, а также расширяется для интеграции в новые и существующие архитектуры.

Для получения дополнительной информации, например

  • поддержка пользовательских магазинов MembershipReboot и ASP.NET
  • поддержка дополнительного связующего ПО Katana (например, Google, Twitter, Facebook и т. д.)
  • поддержка постоянной конфигурации на основе EntityFramework
  • поддержка WS-Federation
  • растяжимость

проверьте документацию и образцы .

  • Omniauth: обратный вызов не срабатывает, возвращает отказ с «недопустимыми учетными данными»
  • Как защитить MongoDB с именем пользователя и паролем
  • Модель профиля для пользователей Devise?
  • Keycloak извлекает пользовательские атрибуты для KeycloakPrincipal
  • HttpURLConnection отлично работает в Android 2.x, но НЕ в 4.1: не обнаружены проблемы аутентификации
  • Аутентификация веб-API ASP.NET
  • Написание привилегированного вспомогательного инструмента с помощью SMJobBless ()
  • OWIN - Authentication.SignOut (), похоже, не удаляет файл cookie
  • Лучшая практика аутентификации на основе токенов REST с JAX-RS и Джерси
  • Микширование форм с помощью проверки подлинности Windows
  • Подтвердить подпись Authenticode на EXE-C ++ без CAPICOM
  • Давайте будем гением компьютера.