#c# #asp.net-mvc #forms-authentication
#c# #asp.net-mvc #формы-аутентификация
Вопрос:
Мне нужна некоторая функциональность в ASP.NET Приложение MVC и после проведения некоторых исследований я чувствую, что мне нужно реализовать пользовательские MembershipUser, MembershipProvider, Identity и Principal. Моя проблема в том, что я не понимаю взаимосвязи, если таковая имеется, между MembershipUser и Identity и где именно MembershipProvider и Principal входят в картину. Не мог бы кто-нибудь, пожалуйста, пролить немного света. В Интернете есть несколько статей и руководств по всем четырем игрокам, но ни в одной из них не рассматривается взаимосвязь между ними полностью.
Также: существует ли элегантный способ присвоения пользовательского участника контексту.Пользователь, отличный от во время AuthenticateRequest в Global.asax? Я видел много примеров того, как это сделать в ASP.NET Приложения WebForms, и мне было интересно, если ASP.NET У MVC есть лучший способ.
Ответ №1:
IPrincipal
— это контекст безопасности, который создается для каждого веб-запроса и содержит информацию, связанную с идентификатором пользователя и ролями, которые у него есть.
IPrincipal
содержит IIdentity
, который имеет свойства Name
, IsAuthenticated
и AuthenticationType
.
пользовательский MembershipProvider
— это класс, который является производным от абстрактного класса MembershipProvider
для предоставления пользовательских данных о пользователях, использующих ваше приложение. Поставщик будет работать с MembershipUser
типами и может использоваться для получения данных по конкретному пользователю или пользователям, создания новых пользователей и т.д. Вы можете наследовать от MembershipUser
, чтобы создать свой собственный тип пользователя, и обычно можете захотеть сделать это, также используя своего собственного провайдера.
Когда вы получаете доступ к приложению, IPrincipal
и IIdentity
создаются и назначаются HttpContext.Current.User
и Thread.CurrentPrincipal
для предоставления информации о безопасности для любых действий, которые могут быть предприняты в течение срока действия запроса.
Если вы используете a RoleProvider
, то создается RolePrincipal
экземпляр type, который подключается к сконфигурированному RoleProvider
, чтобы получить роли для пользователя; если вы не используете a, RoleProvider
тогда GenericPrincipal
создается экземпляр type.
Если вы используете проверку подлинности в формах и пользователь вошел в систему, то создается экземпляр FormsIdentity
типа; если пользователь не аутентифицирован, то создается экземпляр GenericIdentity
типа. IIdentity
Созданное — это то, что в конечном итоге будет сериализовано в файл cookie аутентификации, передаваемый обратно браузеру, и что будет использовано для создания FormsAuthenticationTicket
и IIdentity
при следующем запросе.
MembershipProvider
Вписывается в это, предоставляя дополнительную информацию о пользователе. метод статического Membership
класса GetUser()
будет использовать текущий IIdentity.Name
и сконфигурированный MembershipProvider
для возврата экземпляра MembershipUser
(или производного класса, если вы его определили), содержащего данные о пользователе.
Поскольку ASP.NET MVC построен поверх ASP.NET конвейер обработки, место, где вы хотели бы установить свой собственный IIdentity
и IPrincipal
, совпадает. Насколько я знаю, в архитектуре MVC нет лучшего места для их установки.
Примечание: все это из памяти. Если я что-то перепутал, пожалуйста, дайте мне знать, и я обновлю.
Комментарии:
1. Обратите внимание, что в MVC 5 Microsoft отказалась от MembershipProvider в пользу ASP.net Идентификация.