MVC 5 и идентификация ASP.NET - путаница реализации

Я создаю новое веб-приложение, которое будет написано с использованием MVC 5 и Entity Framework Database First Approach. Я также хотел бы использовать ASP.Net Identity, чтобы следить за членством, аутентификацией, авторизацией и т.д.

Я хорошо прочитал об идентификаторе ASP.Net в Интернете и о том, как это работает, однако я все еще узнаю об этой теме.

Когда я создал приложение MVC 5 в Visual Studio 2013 и посмотрел на Контроллер учетной записи, мой первый инстинкт состоял в том, что мне не понравилось то, что я увидел, т.е. DbContext ссылался на " ApplicationDbContext". Причина, по которой мне это не нравилось, заключается в том, что я предпочитаю сохранять свой DbContext в соответствующем проекте в моем решении, то есть в моем уровне модели, который придерживается логики разделения проблем.

Кроме того, проект из проекта MVC 5 использует проект Entity Framework Code First для создания базы данных по умолчанию и таблиц для хранения пользователей, ролей и т.д.

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

Я по-прежнему хочу использовать новейшую идентификацию ASP.Net для своего приложения, поскольку она имеет много преимуществ, поэтому я нашел эту статью, которая полностью удалила код Entity Framework, но все еще получила аутентификацию с использованием OWIN в ASP.NET MVC.

http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown-part-deux

Используя приведенный выше учебник, введите метод HttpPost Login для моего Контроллера учетных записей

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            //Calling my own custom Account Service which validates users login details
            var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
            if (user)
            {
                var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

                //ToDo: Manually adding Role, but will pull from db later
                identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));

                AuthenticationManager.SignIn(new AuthenticationProperties
                {
                    IsPersistent = model.RememberMe
                }, identity);

                return RedirectToAction("Index", "MyDashboard");
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        return View(model);
    }

В моих предыдущих приложениях MVC я обычно заказывал свое собственное пользовательское членство, и когда Пользователь регистрировался на сайте и был аутентифицирован, я бы сохранил любые дополнительные данные пользователя, такие как userID, DOB и т.д. в UserData строки FormsAuthenticationTicket.

Поскольку в приведенном выше коде не используется FormsAuthentication, вместо этого он использует OWIN CookieAuthentication, я не уверен, как хранить эти дополнительные пользовательские данные.

Поэтому у меня есть несколько вопросов о проблемах, которые я испытываю.

  • Как сохранить идентификатор пользователя или любую другую дополнительную часть пользовательских данных (DOB и т.д.) так, как я использовал в FormsAuthentication? Это делается путем добавления претензии к идентификатору?

  • Является ли метод использования ASP.Net Identity/OWIN выше правильным, учитывая, что я использую Entity Framework Database First с существующей базой данных?

  • Должен ли я использовать код, который используется в контроллере учетных записей, то есть UserManager, ApplicationUser, ApplicationDbContext и т.д., и использовать его для работы с моей существующей базой данных?

Извиняюсь, если мой вопрос запутан, я полагаю, что я немного не уверен, какой подход я должен использовать, пытаясь использовать идентификатор ASP.Net в своем последнем проекте.

Приветствуется любая обратная связь.

Спасибо.

Ответ 1

1) Новое связующее ПО Katana Cookie поддерживает заявки. Это то, что делает это лучше, чем формы auth cookie; претендует модель любой пары ключ/значение, и они могут быть сохранены в файле cookie аутентификации. См. Это сообщение для более подробной информации:

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

2 и 3). Что касается хранилища данных идентификации, если вам нужно работать с существующей таблицей, возможно, вы не сможете использовать классы, предоставленные Microsoft EF. Вместо этого вы останетесь сами по себе, чтобы реализовать IUserStore и все другие интерфейсы хранилища, которые нужны вашему приложению. Я не уверен, что стоит изменить то, что вы уже используете для хранения пользовательских данных.

Имейте в виду, что часть OWIN/Katana отделена от хранилища удостоверений.

Ответ 2

Вот решение

Чтобы ускорить работу, вы можете добавить пример приложения в свой проект и начать с изменения примерного приложения, приложение Samples включает в себя подтверждение электронной почты, восстановление пароля, управление ролью администратора и пользователя и т.д. пакет NuGet находится по адресу:

Install-Package Microsoft.AspNet.Identity.Samples -Pre 

Подробнее см. здесь пример приложения: ASP.NET Identity 2.0: настройка пользователей и ролей

Управляйте доступом к контроллеру или действию с помощью следующих атрибутов

[Authorize] //Anyone with authorization
[Authorize(Roles="Administrator")] //Admin role only

Проверьте, находится ли пользователь в роли

HttpContext.User.IsInRole("Administrator")
UserManager.IsInRole(userID, "Administrator")

Получить данные профиля

// Create manager
 var manager = new UserManager<ApplicationUser>(
    new UserStore<ApplicationUser>(new ApplicationDbContext()))

// Find user
var user = manager.FindById(User.Identity.GetUserId());
var profileProperty_1 = user.profileProperty_1