ASP.NET MVC: отношения между MembershipUser, Identity, MembershipProvider и принципалом - PullRequest
14 голосов
/ 10 апреля 2011

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

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

1 Ответ

27 голосов
/ 10 апреля 2011

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

и 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 класса GetUser() будет использовать текущий IIdentity.Name и настроенный MembershipProvider для возврата экземпляра MembershipUser (или производного класса, если вы 'мы определили один), содержащий данные о пользователе.

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

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

...