ASP.NET MVC: отношения между MembershipUser, Identity, MembershipProvider и Principal

Мне нужна некоторая функциональность в приложении ASP.NET MVC, и после некоторых исследований я чувствую, что мне нужно реализовать пользовательские MembershipUser, MembershipProvider, Identity и Principal. Моя проблема: я не понимаю отношения, если они есть, между MembershipUser и Identity и где именно членствоProvider и Principal входят в картину. Может кто-то пролить некоторый свет. У меня есть несколько статей и руководств по всему миру о всех четырех игроках, но никто не затрагивает отношения между ними полностью.

Также: есть ли элегантный способ назначения пользовательского принципала для Context.User, кроме как во время AuthenticateRequest в Global.asax? Я видел много примеров того, как это сделать в приложениях ASP.NET WebForms, и мне было интересно, имеет ли лучший способ ASP.NET MVC.

Ответы

Ответ 1

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

a IPrincipal содержит IIdentity, который имеет свойства Name, IsAuthenticated и AuthenticationType.

пользовательский MembershipProvider - это класс, который выводится из абстрактного класса MembershipProvider для предоставления пользовательских данных о пользователях, которые используют ваше приложение. Поставщик будет работать с MembershipUser и может использоваться для получения данных для определенного пользователя или пользователей, создания новых пользователей и т.д. Вы можете наследуйте от MembershipUser, чтобы создать свой собственный тип пользователя и, как правило, можете сделать это, когда также используете своего собственного провайдера.

При доступе к приложению создаются и привязаны IPrincipal и IIdentity к HttpContext.Current.User и Thread.CurrentPrincipal, чтобы предоставить информацию о безопасности для любых действий, которые могут быть предприняты в течение срока службы запроса.

Если вы используете RoleProvider, то создается экземпляр типа RolePrincipal, который подключается к настроенному RoleProvider получить роли для пользователя; если вы не используете RoleProvider, тогда создается экземпляр типа GenericPrincipal.

Если вы используете аутентификацию форм и пользователь вошел в систему, создается экземпляр типа FormsIdentity; если пользователь не аутентифицирован, создается экземпляр типа GenericIdentity. Созданный IIdentity - это то, что в конечном итоге будет сериализовано в cookie аутентификации, переданное обратно в браузер, и что будет использовано для создания FormsAuthenticationTicket и IIdentity в следующем запросе.

MembershipProvider соответствует этому, предоставляя дополнительную информацию о пользователе. статический метод Membership class GetUser() будет использовать текущий IIdentity.Name и настроенный MembershipProvider, чтобы вернуть экземпляр MembershipUser (или производного класса, если вы его определили), содержащий данные о пользователе.

Так как ASP.NET MVC построен поверх конвейера обработки ASP.NET, то место, где вы хотите установить свои собственные IIdentity и IPrincipal, будет таким же. Насколько я знаю, в архитектуре MVC нет лучшего места для их установки.

Примечание: все это из памяти. Если у меня что-то не так, сообщите мне, и я уточню.