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

164

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

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

разъем
источник
Какой замечательный квестон и какой простой солютин дан чуть ниже. Я любил его читать и остро нуждался в интеграции в мой существующий проект.
Ишвор Ханал

Ответы:

282

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

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

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

Добавьте пользовательский класс и с 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родителя с DbContextтаким, IdentityDbContext<AppUser>как это:

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

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

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

public class AppUserManager : UserManager<AppUser>
{
    public AppUserManager(IUserStore<AppUser> store)
        : base(store)
    {
    }

    // this method is called by Owin therefore this is the best place to configure your User Manager
    public static AppUserManager Create(
        IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
    {
        var manager = new AppUserManager(
            new UserStore<AppUser>(context.Get<MyDbContext>()));

        // optionally configure your manager
        // ...

        return manager;
    }
}

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

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

namespace MyAppNamespace
{
    public class IdentityConfig
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext(() => new MyDbContext());
            app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
            app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
                new RoleManager<AppRole>(
                    new RoleStore<AppRole>(context.Get<MyDbContext>())));

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Home/Login"),
            });
        }
    }
}

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

<appSettings>
    <!-- other setting here -->
    <add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" />
</appSettings>

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

[HttpPost]
public ActionResult Login(LoginViewModel login)
{
    if (ModelState.IsValid)
    {
        var userManager = HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
        var authManager = HttpContext.GetOwinContext().Authentication;

        AppUser user = userManager.Find(login.UserName, login.Password);
        if (user != null)
        {
            var ident = userManager.CreateIdentity(user, 
                DefaultAuthenticationTypes.ApplicationCookie);
            //use the instance that has been created. 
            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<RoleManager<AppRole>>();

    if (!roleManager.RoleExists(roleName))
        roleManager.Create(new AppRole(roleName));
    // rest of code
} 

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

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

С помощью Authorizeвы можете охранять свои действия или контролеров:

[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;

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

Сэм Фараджпур Гамари
источник
2
Оба решения выглядят одинаково. Я использовал AppRoleи менеджер ролей Identity для классификации пользователей. А поскольку Roles и RoleManagerуже реализованы самой Identity, вам не нужно переписывать уже реализованный код. Я обновлю пост, чтобы показать вам, как вы можете использовать роли. И, как я уже говорил, вам просто нужно добавить AppUserи AppRoleсущности для инициализации Identity. Унаследовав свою DbContextот IdentityDbContext<AppUser>всех необходимых таблиц, добавь свою таблицу. Вам не нужно ничего делать, просто включите миграцию.
Сэм Фараджпур Гамари
2
Я просто добавил пример использования. Установите Microsoft.AspNet.Identity.EntityFrameworkв свой домен и другое для пользовательского интерфейса.
Сэм Фараджпур Гамари,
2
1) Не беспокойся о своем web.config. Не заменяйте старый. Прочитайте это для получения дополнительной информации . Я думаю, что ваш MVC также обновлен.
Сэм Фараджпур Гамари,
1
2) Вы сделали правильно. 3) нет проблем. У вас будет 5 новых столов AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRolesиAspNetUsers
Сэм Фараджпур Гамари
3
Я только что прочитал все комментарии, которые ты оставил, помогая Клинту Иствуду, Хорошая Работа !! Мир нуждается в большем количестве людей, как Вы plusOne
Chef_Code
24

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

  1. Создайте пример проекта MVC с шаблоном MVC. Здесь есть весь код, необходимый для реализации Identity - Startup.Auth.cs, IdentityConfig.cs, код контроллера учетных записей, управление контроллером, модели и связанные представления.

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

  3. Скопируйте весь этот код в ваш существующий проект. Обратите внимание: не забудьте добавить строку подключения «DefaultConnection», чтобы Identity отображался в вашей базе данных. Пожалуйста, проверьте класс 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. Проверьте и устраните все оставшиеся ошибки, и все готово. Личность справится с остальными :)

Шьямал Парих
источник
1
Большое спасибо за ваш ответ и хорошие объяснения. На самом деле я думаю об использовании другого подхода, но я тоже попробую. Проголосовано +
Джек
2
Я думаю, что это гораздо более чистый подход
niico
3
В дополнение к классу Startup.Auth.cs вам необходимо скопировать файл Startup.cs, расположенный в корне примера проекта.
Падмика
Шьямал, можешь ли ты добавить Startup.cs из комментария @ Padmika? Это важно.
Майк
4

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

обзор

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

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

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

Проверьте документацию и демо .

TotPeRo
источник
6
Перед использованием вслепую в реализации IdentityServer следует рассмотреть практическое использование IdentityServer.
Hanzolo