Подтвердить что ты не робот

Перемещение модели Identity ASP.NET в библиотеку классов

Я пытаюсь переместить модель Identity в библиотеку классов, используя методы в этой ссылке:

ASP.NET Identity в библиотеке служб

Проблема 1: Кажется, что она использует строку подключения к проекту веб-сайта. Я преодолел это, указав полную строку соединения в библиотеке классов. Могу ли я заставить IdentityDbContext использовать строку подключения библиотеки классов?

Проблема 2: Из-за проблемы 1, если я удаляю Entity Framework из проекта веб-сайта. Это приведет к следующей ошибке: он ищет EF SqlClient в проекте веб-сайта.

Исключение типа "System.InvalidOperationException" произошло в EntityFramework.dll, но не было обработано в коде пользователя

Дополнительная информация: Поставщик ADO.NET не найден провайдер Entity Framework с инвариантным именем "System.Data.SqlClient". Убедитесь, что провайдер зарегистрирован в разделе "entityFramework" файла конфигурации приложения. Подробнее см. http://go.microsoft.com/fwlink/?LinkId=260882.

Другие решения приветствуются до тех пор, пока в проекте веб-сайта не будут удалены все ссылки уровня доступа к данным, такие как EF.

4b9b3361

Ответ 1

Чтобы переместить IdentityModel в библиотеку классов (что правильно делать в соответствии с SRP), выполните следующие действия:

  • Создайте библиотеку классов. (ClassLibrary1)
  • Используя NuGet, добавьте ссылку на Microsoft.AspNet.Identity.EntityFramework. Это также автоматически добавит некоторые другие ссылки.
  • Добавьте ссылку на свой сайт в ClassLibrary1
  • Найдите WebSite/Models/IdentityModel.cs и переместите его в ClassLibrary1.
  • Сделайте IdentityModel.cs следующим образом:

    public class ApplicationUser : IdentityUser
    {
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("YourContextName")
        {
        }
    }
    
  • Убедитесь, что на вашем веб-сайте Web.config есть значение YourContextName, указывающее на правильную базу данных в этом разделе. (Примечание: эта база данных может и должна содержать данные вашего приложения).

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere"
      providerName="System.Data.SqlClient" />
    
  • Сделайте класс EF Context наследованием из вашего ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

Когда кто-либо на вашем сайте пытается войти в систему или зарегистрироваться, система Identity отправит их в вашу базу данных со всеми вашими данными, которые включают таблицы Identity.

Хорошо идти!

Ответ 2

Обновление для ответа @Rap для EF6 и Identity 2.0:

  • Создайте библиотеку классов. (ClassLibrary1)
  • Используя NuGet, добавьте ссылку на Microsoft.AspNet.Identity.EntityFramework и Microsoft.AspNet.Identity.Owin.
  • Добавьте ссылку на свой сайт в ClassLibrary1
  • Найдите WebSite/Models/IdentityModel.cs и переместите его в ClassLibrary1.
  • IdentityModel.cs должен выглядеть так, не нужно ничего менять:

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
            // Add custom user claims here
            return userIdentity;
        }
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
    
  • Убедитесь, что на вашем веб-сайте Web.config есть контекст, указывающий на правильную базу данных в этом разделе. (Примечание: эта база данных может и должна содержать данные вашего приложения).

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  • Сделайте класс EF Context наследованием из вашего ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

Ответ 3

Что вы понимаете, переместив Identity в библиотеку классов? для использования в качестве ссылки? У меня есть пользовательский пользовательский менеджер и пользователь в отдельной библиотеке, но это все.

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

Сверху моей головы...

var mgr = new UserManager<ApplicationUser>(
     new IUserStore_ofYourChoice<ApplicationUser>(
       new DbContextName("ConnectionStringOverload"));

Я думаю, что хранилище EF является "UserStore", должно быть проверено.

В настоящее время существует около десятка различных пакетов nuget для хранилищ данных для Identity. Вам не нужно использовать EF, но для этого требуется некоторый запас.

** РЕДАКТИРОВАТЬ **

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

Ответ 4

Есть несколько правил, которые вы должны знать и помнить.

Во-первых, веб-проект ВСЕГДА и ТОЛЬКО использует файлы web.config, которые он находит в своем собственном проекте. Неважно, что вы добавили в любой другой файл конфигурации в другом месте вашего решения. Веб-проект может ТОЛЬКО использовать то, что он находит в своем собственном проекте. Если у вас есть строка подключения в другом проекте, вы должны реплицировать ее в веб-проект, иначе ее никогда не будет найдено.

Во-вторых, если веб-проект является вашим проектом запуска и предполагая, что вы используете миграцию данных (поскольку Identity использует его), обратите внимание, что менеджер пакетов AlWAYS использует строку подключения, которую он находит в стартовом проекте. Следовательно, менеджер пакетов для базы данных обновлений не будет использовать строку подключения в вашем проектном проекте.

Простое решение: 1. Скопируйте строку соединения из проекта модели в свой веб-проект. 2. В консоли диспетчера пакетов убедитесь, что раскрывающийся список для выбора контекста указывает на ваш проект модели.

Ответ 5

Вопрос 1: -

Я думаю, можно использовать решение, найденное по ссылке ниже: -

Настройка платформы Entity Framework для строки динамического соединения

Вопрос 2: -

Я считаю, что инфраструктура сущности создает способ, когда время выполнения будет использовать web.config этого проекта. Инструкция от Microsoft также предполагает, что

http://msdn.microsoft.com/en-us/library/vstudio/cc716677(v=vs.100).aspx

Ответ 6

Пожалуйста, взгляните на проект, который я загрузил в Github. https://github.com/giorgos07/AspNet.Identity.AdoNetProvider Он содержит 2 проекта: библиотека классов, имеющих реализацию ASP.NET Identity (с использованием ADO.NET) в качестве отдельного проекта и Приложение ASP.NET MVC, демонстрирующее, как использовать Identity. Надеюсь, это поможет вам.